Algorithm

[Node.js] 1913. 달팽이

합주기 2025. 4. 24. 20:42

문제 설명

홀수인 자연수 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