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

KIMYEONGJUN·2026년 8월 16일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

양의 정수 n이 매개변수로 주어집니다.
n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.

내가 이 문제를 보고 생각해본 부분

answer라는 정수형 2차원 배열을 크기 n×n으로 생성한다.
숫자를 채울 변수 num을 1로 초기화한다.
네 개의 경계 변수 top, bottom, left, right는 각각 행과 열의 시작과 끝 인덱스를 나타낸다.
while 반복문 내에서 숫자 num이 n2보다 작거나 같을 때까지 네 방향으로 숫자를 채운다.
왼쪽에서 오른쪽으로 이동:
top 행의 left부터 right까지 순차적으로 숫자를 할당하고, 숫자 num을 증가시킨다.
채운 후 top을 1 증가시켜 윗 행 경계를 아래로 이동시킨다.
위에서 아래로 이동:
right 열의 top부터 bottom까지 숫자를 채운다.
채운 후 right를 1 감소시켜 오른쪽 경계를 왼쪽으로 좁힌다.
오른쪽에서 왼쪽으로 이동:
bottom 행의 right부터 left까지 숫자를 채운다.
채운 후 bottom을 1 감소시켜 아래 경계를 위쪽으로 올린다.
아래에서 위로 이동:
left 열의 bottom부터 top까지 숫자를 채운다.
채운 후 left를 1 증가시켜 왼쪽 경계를 오른쪽으로 이동시킨다.
이 과정을 반복하면 테두리부터 안쪽으로 점차 나선 모양으로 숫자가 채워진다.
최종적으로 숫자가 모두 채워진 answer 2차원 배열을 반환한다.

코드로 구현

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int num = 1;
        int top = 0;
        int bottom = n - 1;
        int left = 0;
        int right = n - 1;

        while (num <= n * n) {
            for (int col = left; col <= right && num <= n*n; col++) {
                answer[top][col] = num++;
            }
            top++;

            for (int row = top; row <= bottom && num <= n*n; row++) {
                answer[row][right] = num++;
            }
            right--;

            for (int col = right; col >= left && num <= n*n; col--) {
                answer[bottom][col] = num++;
            }
            bottom--;

            for (int row = bottom; row >= top && num <= n*n; row--) {
                answer[row][left] = num++;
            }
            left++;
        }

        return answer;
    }
}

프로그래머스 코드

package programmers.programmers2;

import java.util.Arrays;

// 프로그래머스 정수를 나선형으로 배치하기
public class Main113 {
    public static void main(String[] args) {
        int n = 4;  // 여기서 배열 크기 설정 가능
        Solution solution = new Solution();
        int[][] result = solution.solution(n);

        // 결과 출력: 2차원 배열 형태로 보기 좋게 출력
        for (int[] row : result) {
            System.out.println(Arrays.toString(row));
        }
    }

    // 정수를 나선형으로 배치하는 Solution 클래스
    static class Solution {
        public int[][] solution(int n) {
            int[][] answer = new int[n][n];
            int num = 1;
            int top = 0;
            int bottom = n - 1;
            int left = 0;
            int right = n - 1;

            while (num <= n * n) {
                // 왼쪽에서 오른쪽
                for (int col = left; col <= right && num <= n * n; col++) {
                    answer[top][col] = num++;
                }
                top++;

                // 위에서 아래로
                for (int row = top; row <= bottom && num <= n * n; row++) {
                    answer[row][right] = num++;
                }
                right--;

                // 오른쪽에서 왼쪽으로
                for (int col = right; col >= left && num <= n * n; col--) {
                    answer[bottom][col] = num++;
                }
                bottom--;

                // 아래에서 위로
                for (int row = bottom; row >= top && num <= n * n; row--) {
                    answer[row][left] = num++;
                }
                left++;
            }

            return answer;
        }
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글