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

김하밍·2024년 4월 1일

알고리즘

목록 보기
17/22

문제

문제 링크

문제 이해하기

  • 나선형으로 배열을 채우는 문제
  • 같은 방향을 수행하더라도, 시작하는 행 또는 열은 다를 수 있습니다.
  • 필요한 방향과 인덱스를 조절하기 위해 switch-case 문을 사용합니다.
  • 각 방향별로 배열을 채우는 과정을 구현하고, 반복할 때마다 방향을 변경하도록 합니다.
  • 모든 배열 요소가 채워질 때까지 반복합니다.

실수와 해결

  • switch-case 문 내에서 각 case에 대한 작업을 마친 후에 break 문을 추가하여 다음 case로 넘어가지 않도록 해결했습니다.
  • 배열을 나선형으로 채우는 로직에서 모든 요소를 채우면 반복을 종료하는 조건을 설정합니다.
  • case에 따라 증가가 아닌 감소하는 for문의 조건식 작성할 때
    i가 n - 1 부터 시작하여 i-- 하는 for문에서의 조건식을 i == 0 으로 설정하여 반복문이 정상적으로 수행되지 않는 문제가 발생했습니다. i가 0이 될 때까지 반복문을 수행해야 하므로 i가 n - 1 부터 감소하여 0에 도달할 때까지를 나타내는 조건식인 i >= 0 으로 수정하여 해결했습니다.
    <참고>
    for문의 증가하는 조건식과 감소하는 조건식 작성하는 방법

제출한 코드

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int index = 0;
        int num = 1;
        int startRow = 0;
        int startCol = n - 1;
        int endRow = n - 1;
        int endCol = 0;

        while (num <= n * n) {

            switch (index) {
                case 0: {   // 오른쪽 방향
                    for (int i = 0; i < n; i++) {
                        if (answer[startRow][i] == 0) {
                            answer[startRow][i] = num++;
                        }
                    }
                    startRow++;
                    index++;
                    break;
                }

                case 1: {   // 아래 방향
                    for (int i = 0; i < n; i++) {
                        if (answer[i][startCol] == 0) {
                            answer[i][startCol] = num++;
                        }
                    }
                    startCol--;
                    index++;
                    break;
                }

                case 2: {   // 왼쪽 방향
                    for (int i = n-1; i >= 0; i--) {
                        if (answer[endRow][i] == 0) {
                            answer[endRow][i] = num++;
                        }
                    }
                    endRow--;
                    index++;
                    break;
                }

                case 3: {   // 위쪽 방향
                    for (int i = n - 1; i >= 0; i--) {
                        if (answer[i][endCol] == 0) {
                            answer[i][endCol] = num++;
                        }
                    }
                    endCol++;
                    index = 0;
                    break;
                }
            }
        }

        return answer;
    }
}

심화학습 계획

  • 코드 리팩토링
    코드의 가독성과 유지보수성을 높이기 위해 리팩토링 수행하기
profile
나만의 언어로 기록하며 성장하기 !

0개의 댓글