이 문제는 주어진 n × n 크기의 이차원 배열에 숫자를 시계방향 나선형으로 배치하는 문제다. 배열을 시계방향으로 채우기 위해 먼저 이동 방향을 설정합니다. 오른쪽, 아래, 왼쪽, 위의 네 가지 방향으로 이동하며, 이를 구현하기 위해 행과 열의 변화량을 나타내는 배열을 사용한다. 행의 변화량은 오른쪽, 아래, 왼쪽, 위의 순서대로 dr = {0, 1, 0, -1}로 설정하고, 열의 변화량은 같은 순서로 dc = {1, 0, -1, 0}으로 정의한다.
배열을 채우는 도중, 다음으로 이동하려는 위치가 배열의 경계를 벗어나거나 이미 값이 채워져 있는 경우에는 방향을 전환해야 한다. 이러한 조건을 확인하여 올바른 방향으로 계속 이동할 수 있도록 한다.
배열 채우기는 [0][0]에서 시작하며, 시계방향으로 이동하면서 값을 순서대로 채운다. 숫자는 1부터 시작하여 n × n까지 차례대로 배열에 배치하며, 모든 숫자가 채워질 때까지 작업을 반복합니다. 이를 통해 나선형으로 배열을 채우는 과정을 완성할 수 있다.
public class ArrangingPattern {
public int[][] solution(int n) {
int[][] answer = new int[n][n];
int[] dr = {0, 1, 0, -1};
int[] dc = {1, 0, -1, 0};
int r = 0, c = 0, d = 0, seed = 1;
int total = n * n;
while (seed <= total) {
answer[r][c] = seed++;
int nr = r + dr[d];
int nc = c + dc[d];
if (nr < 0 || nr >= n || nc < 0 || nc >= n || answer[nr][nc] != 0) {
d = (d + 1) % 4;
nr = r + dr[d];
nc = c + dc[d];
}
r = nr;
c = nc;
}
return answer;
}
}