정수를 나선형으로 배치하기

이 문제는 주어진 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;
    }
}

코딩테스트 연습 - 정수를 나선형으로 배치하기