문제 설명
홀수인 자연수 N이 주어지면, NxN 그리드에 달팽이(=나선형) 모양으로 값을 채우는 문제이다.
단 N <= 999 임.
문제 풀이
1. 시작 지점을 구해야 한다. 👉 sr, sc (startR, startC)
- N = 3일 경우, (1,1)
- N = 5일 경우, (2,2)
- N = 7일 경우, (3,3)
sr = Math.floor(N / 2)
sc = Math.floor(N / 2)
2. 나선형으로 돌려야한다.
아래 그림을 보면 맨처음은 위로 1번 이동하고 오른쪽으로 1번 이동하는 것을 알 수 있다.
그 다음에는 아래로 2번 이동 왼쪽으로 2번 이동했다.
그 다음에는 위로 3번 이동 오른쪽으로 3번 이동했다.
같은 방향으로 가야하는 칸의 수를 step이라고 하고, step = 1로 초기화한다.
- step = 1 로 두 방향(위, 오른쪽)
- step = 2 로 두 방향(아래, 왼쪽)
- step = 3 로 두 방향 (위쪽, 오른쪽)
이를 코드로 구현하면 아래와 같다.
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf8").trim().split("\n");
const N = Number(input[0]);
const target = Number(input[1]);
const dr = [0, 1, 0, -1]; // 오른쪽, 아래, 왼쪽, 위
const dc = [1, 0, -1, 0];
let dirNum = 3; // 위쪽부터 시작
const sr = Math.floor(N / 2);
const sc = Math.floor(N / 2);
const grid = Array.from({ length: N }, () => Array(N).fill(0));
solution();
function solution() {
let r = sr;
let c = sc;
let num = 1;
let step = 1;
grid[r][c] = num++;
while (1) {
// 각 방향으로 step만큼 이동
for (let i = 0; i < 2; i++) {
for (let j = 0; j < step; j++) {
r += dr[dirNum];
c += dc[dirNum];
grid[r][c] = num++;
if (num > N * N) return;
}
dirNum = (dirNum + 1) % 4; // 방향 전환
}
step++; // 이동 거리 증가
}
}
grid.forEach((row) => console.log(row.join(" ")));
let i, j;
grid.forEach((row, r) => row.forEach((v, c) => (v === target ? ([i, j] = [r + 1, c + 1]) : null)));
console.log(i, j);
'Algorithm' 카테고리의 다른 글
[JavaScript] 백준 12933. 오리 (1) | 2025.04.11 |
---|---|
[JavaScript] 백준 14888. 연산자 끼워넣기 (0) | 2025.04.08 |
[JavaScript] 백준 2294. 동전2 (0) | 2025.04.02 |
[JavaScript] 12904. A와 B (1) | 2025.03.27 |
[JavaScript] 1446. 지름길 (1) | 2025.03.26 |