[프로그래머스/181832] 정수를 나선형으로 배치하기

☑️ 문제

프로그래머스 181832

☑️ 풀이

//시간: 0.11ms
//메모리: 81.3MB

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        boolean[][] visited = new boolean[n][n];
        int[] dx = {0, 1, 0, -1}; // 우, 하, 좌, 상
        int[] dy = {1, 0, -1, 0};
        int x = 0, y = 0, dir = 0, num = 1;

        while (num <= n * n) {
            answer[x][y] = num++;
            visited[x][y] = true;

            int nx = x + dx[dir];
            int ny = y + dy[dir];

            if (nx < n && ny < n && nx >= 0 && ny >= 0 && !visited[nx][ny]) {
                x = nx;
                y = ny;
            } else {
                dir = (dir + 1) % 4;
                x += dx[dir];
                y += dy[dir];
            }
        }

        return answer;
    }
}
  • dx,dy 테크닉을 이용하여 우 → 하 → 좌 → 상 순서로 방향으로 바꾸며 배열을 채워나갔다.
  • visited 배열을 사용하여 이동이 가능한 지 체크하고, 만약 이동이 불가능하다면 방향을 바꾼다.
    • 다음 방향은 나머지 연산을 통해 (dir + 1) % 4 로 계산한다.

© 2021. All rights reserved.

yaejinkong의 블로그