본문 바로가기

프로그래머스(Java)/Level 0

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

728x90

코드 힌트

  1. 방향 배열 설정:
    • 상, 좌, 하, 우 방향을 배열 dx와 dy를 사용하여 정의합니다. 각각의 방향은 (x, y) 좌표에서의 이동을 나타냅니다. 예를 들어, (1, 0)은 오른쪽으로 이동하는 것을 의미합니다.
  2. 결과 배열 초기화:
    • int[][] result = new int[n][n];를 사용하여 n x n 크기의 배열을 생성합니다. 이 배열은 숫자를 채우기 위한 결과 배열입니다. 배열의 기본값은 0입니다.
  3. 변수 초기화:
    • 숫자 num을 1로 초기화하고, 현재 위치를 (0, 0)으로 설정합니다. direction 변수를 0으로 초기화하여 오른쪽 방향으로 시작합니다.
  4. 숫자 채우기:
    • 현재 위치가 배열의 유효한 위치이고, 그 위치에 숫자가 아직 채워져 있지 않으면, 현재 위치에 숫자를 채우고 숫자를 증가시킵니다.
  5. 방향 변경:
    • 현재 위치가 유효하지 않거나 이미 값이 채워져 있는 경우, 이전 방향으로 되돌아가서 방향을 변경합니다. 방향을 변경할 때는 direction을 업데이트하여 새로운 방향으로 이동할 수 있게 합니다.
  6. 다음 위치로 이동:
    • 현재 방향에 따라 (x, y) 좌표를 업데이트하여 다음 위치로 이동합니다. 방향이 바뀔 때마다 좌표를 업데이트하고, 배열의 범위를 벗어나지 않도록 체크합니다.
  7. 결과 반환:
    • 배열 result를 완성한 후, 결과를 반환합니다. 배열은 숫자가 스파이럴 형태로 채워진 상태입니다.

 


정답은 더보기 클릭

더보기
class Solution {
    public int[][] solution(int n) {
        // 상, 좌, 하, 우 방향을 나타내는 배열
        int[] dx = {1, 0, -1, 0};
        int[] dy = {0, -1, 0, 1};
        
        // 결과 배열을 생성
        int[][] result = new int[n][n];
        
        int num = 1; // 배열에 채울 숫자
        int x = 0, y = 0; // 현재 위치
        int direction = 0; // 현재 방향 (0: 오른쪽, 1: 위쪽, 2: 왼쪽, 3: 아래쪽)
        
        while (num <= n * n) {
            // 현재 위치가 유효하고 값이 0이면 숫자를 채운다
            if (x >= 0 && x < n && y >= 0 && y < n && result[y][x] == 0) {
                result[y][x] = num++;
            } else {
                // 유효하지 않은 위치일 때, 방향을 되돌리고 방향을 변경
                x -= dx[direction];
                y -= dy[direction];
                direction = (direction + 1) % 4;
            }
            
            // 다음 위치로 이동
            x += dx[direction];
            y += dy[direction];
        }
        
        return result;
    }
728x90