Notice
Recent Posts
Recent Comments
Link
관리 메뉴

윤일무이

[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : 구름 찾기 깃발 본문

⚙️ 코딩테스트

[JavaScript] 구름톤 챌린지 2주차 코딩테스트 : 구름 찾기 깃발

썸머몽 2023. 8. 22. 12:21
728x90

📌  문제

📌  입력

📌  출력

📌  예제 입출력


📌  풀이

알아야 하는 것

  • 좌표로 접근할 때 상하좌우 + 대각선
    • 주로 dx, dy로 상하좌우를 표현한다. 주의할 점은 그래프와 달리 배열에서 이런 변화량을 표현할 때 좌우는 -1, 0으로 우측으로 갈수록 +1이 되는 점은 똑같지만 상하일 때는 -1, 0으로 위로 갈수록 -1이 된다는 점이다.
    • 그래서 [1, 0], [-1, 0], [0, -1], [0, 1] 이런 식으로 우측 이동, 좌측 이동, 위로 이동, 아래로 이동을 표현할 수 있다.
    • 대각선도 비슷한데 예컨대 왼쪽 위를 향한 대각선이라고 하면 x축으로 좌측이니 -1, 위를 향했으면 y축으로 위쪽이니 -1로 [-1, -1] 이렇게 표현할 수 있다. 즉 반시계 방향으로 왼쪽 위부터 표현하자면 [-1, -1], [-1, 1], [1, 1], [1 -1] 이라고 할 수 있다.

구할 것

  • 입력값 받기
    • 첫 줄에 주어진 첫 번째 값, 게임판의 크기를 scale이라고 받고 두 번째 값을 target으로 받았다.
    • target과 같은 수가 몇 개 있는지 세는 변수를 count, 구름의 개수는 cloudCount로 선언했다.
  • 깃발 세우기
    • 깃발은 구름이 없는 칸에만 세울 수 있다. 따라서 board를 가로세로 2중 for문으로 순회하면서 그 값이 0일 때 세운다.
    • 만약에 board[i][j]가 0이라면, 여길 기준으로 상하좌우 대각선에는 뭐가 있는지 탐색한다.
    • 위에서 말한 것처럼 상하좌우 대각선의 변화량을 현재 위치인 i, j에 각각 더해준다.
    • 그렇게 계산한 값의 x축과 y축 모두 0보다 크거나 같고, scale보다는 작으며 board에서 값이 1일 경우(구름이 있을 경우) cloudCount++ 한다.
    • 모두 계산한 후 cloudCount가 target과 같다면 count++ 한다.
const readline = require('readline');
let rl = readline.createInterface({
	input: process.stdin,
	output: process.stdout,
});
let input = [];
rl.on('line', (line) => {
	input.push(line);
	if (input.lenght === Number(line.split(" ")[0])+1) {
		rl.close();
	}
});

rl.on('close', () => {
	let [scale, target] = input.shift().split(" ").map(Number);
	let board = [];
	for (let i = 0; i < scale; i++) {
		board.push(input[i].split(" ").map(Number))
	}
	
	let count = 0;
	// 상하좌우 반시계방향
	let dt = [[0, -1], [0, 1], [-1, 0], [1, 0], [-1, -1], [-1, 1], [1, 1], [1, -1]];
	
	for (let i = 0; i < scale; i++) {
		for (let j = 0; j < scale; j++) {
			if (board[i][j] === 0) {
				let cloudCount = 0;
				for (let d = 0; d < 8; d++) {
					const nx = i + dt[d][0];
					const ny = j + dt[d][1];
					if (nx >= 0 && ny >= 0 && nx < scale && ny < scale && board[nx][ny] === 1) {
						cloudCount++
					}
				}
			if (cloudCount === target) {
				count++;
				}
			}
		}
	}
	console.log(count)
})

깃발은 구름이 없는 칸에만 세울 수 있다는 걸 못 봐서 헤매고 있었다...

 

728x90