코딩테스트/프로그래머스

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

블로그 주인장 2024. 3. 26.

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/181832

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

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

 

제한 사항

  • 1 ≤ n ≤ 30

 

입출력 예

n result
4 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

 

 

입출력 예 설명

  • 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
  • 따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.

 

  • 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.
  • 따라서 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]를 return 합니다.

 

코드 구현

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];

        int num = 1;
        int rowStart = 0;
        int colStart = 0;
        int rowEnd = n - 1;
        int colEnd = n - 1;

        while (num <= n * n) {
            //왼쪽 -> 오른쪽
            for (int i = colStart; i <= colEnd; i++) {
                answer[rowStart][i] = num++;
            }
            rowStart++;

            //왼쪽 -> 오른쪽
            for (int i = rowStart; i <= rowEnd; i++) {
                answer[i][colEnd] = num++;
            }
            colEnd--;

            //오른쪽 -> 왼쪽
            for (int i = colEnd; i >= colStart; i--) {
                answer[rowEnd][i] = num++;
            }
            rowEnd--;

            //아래쪽 -> 위쪽
            for (int i = rowEnd; i >= rowStart; i--) {
                answer[i][colStart] = num++;
            }
            colStart++;
        }

        return answer;
    }
}

 

풀이

  1. num이 n * n 보다 작거나 같을 때까지 반복문을 실행합니다. 반복문은 배열을 나선형으로 채우기 위한 과정을 수행합니다.
  2. 왼쪽에서 오른쪽으로 이동합니다. colStart부터 colEnd까지 반복하면서 answer[rowStart][i]에 num 값을 대입합니다.
  3. 왼쪽 위에서 아래쪽으로 이동합니다. rowStart + 1부터 rowEnd까지 반복하면서 answer[i][colEnd]에 num 값을 대입합니다.
  4. 오른쪽에서 왼쪽으로 이동합니다. colEnd - 1부터 colStart까지 반복하면서 answer[rowEnd][i]에 num 값을 대입합니다.
  5. 왼쪽 아래에서 위쪽으로 이동합니다. rowEnd -1부터 rowStart + 1까지 반복하면서 answer[i][colStart]에 num값을 대입합니다.
  6. 행과 열의 시작과 끝 인덱스를 조정하여 다음 회전을 진행합니다.
  7. 이후 완성된 이차열 배열을 반환합니다.
반응형

댓글