Coding Problem

[BOJ 1913] 달팽이

Yepchani 2025. 3. 22. 20:00
반응형

문제

달팽이

https://www.acmicpc.net/problem/1913

 

 

풀이

설명

1부터 N^2까지의 자연수를 달팽이 모양으로 채우고, 주어진 자연수의 위치를 찾는 문제입니다.

 

방향은 위, 오른쪽, 아래, 왼쪽 순입니다.

이동 횟수는 1 -> 1 -> 2 -> 2 -> 3 -> 3 과 같은 식으로 증가합니다.

방향 전환 후 이동 횟수만큼 이동하며 수를 채우면 됩니다.

 

예시 코드

function solution() {
  const N = Number(input());
  const target = Number(input());
  const maxNum = N * N;
  const matrix = Array.from({ length: N }, () => Array(N).fill(0));
  let num = 1;
  let x = Math.floor(N / 2);
  let y = Math.floor(N / 2);

  matrix[x][y] = num++;

  let layer = 1;
  while (num <= maxNum) {
    // Move up
    for (let i = 0; i < layer; i++) {
      if (num > maxNum) break;
      matrix[--x][y] = num++;
    }
    // Move right
    for (let i = 0; i < layer; i++) {
      if (num > maxNum) break;
      matrix[x][++y] = num++;
    }
    layer++;
    // Move down
    for (let i = 0; i < layer; i++) {
      if (num > maxNum) break;
      matrix[++x][y] = num++;
    }
    // Move left
    for (let i = 0; i < layer; i++) {
      if (num > maxNum) break;
      matrix[x][--y] = num++;
    }
    layer++;
  }

  matrix.forEach((row) => console.log(row.join(" ")));

  let targetPos = [0, 0];
  for (let i = 0; i < N; i++) {
    for (let j = 0; j < N; j++) {
      if (matrix[i][j] === target) {
        targetPos = [i + 1, j + 1];
        break;
      }
    }
  }

  return targetPos.join(" ");
}

'Coding Problem' 카테고리의 다른 글

[BOJ 2785] 체인  (0) 2025.03.24
[BOJ 2653] 수 이어가기  (0) 2025.03.23
[BOJ 2622] 삼각형만들기  (0) 2025.03.21
[BOJ 2659] 십자카드 문제  (0) 2025.03.20
[BOJ 2578] 빙고  (0) 2025.03.19