우당탕탕 개발일지

[프로그래머스] 정수를 나선형으로 배치하기(Java, Level.0) 본문

코테/프로그래머스

[프로그래머스] 정수를 나선형으로 배치하기(Java, Level.0)

ujin302 2025. 3. 17. 17:14
반응형

문제

양의 정수 n이 매개변수로 주어집니다. 

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

 

입출력 예

 

풀이

사실 어떻게 하라는건지 감이 안옴..... 그래서 일단 엑셀에 한번 표현!

 

'질문하기' 살펴보니까 오른쪽 -> 아래 -> 왼쪽 -> 위 이걸 생각하면서 언제 방향을 바꿀지에 대해서 고민해보라고 했다..

 

처음에는 이중 반복문으로 잡고 있다가 while문 사용해보기로..!

 

변수는 총 4개가 필요했다. 

row : 행 번호

col : 열 번호

num : 저장할 숫자

d : 이동 방향을 의미하는 변수

* 변수 d는 아래와 같은 규칙으로 이동해보기로 했다.

0: 오른쪽, 1: 아래, 2: 왼쪽, 3: 위

 

while문에서 answer 배열에 num를 대입하고 사람이 한칸씩 숫자를 작성하는 것처럼 n*n 값이 나올떄까지 움직인다. 

switch문을 활용하여 움직일때마다 다음 방향을 계산하며 그에 따른 row, col 값을 조정한다.

 

최종 코드

public int[][] solution1(int n) {
        System.out.println("정수를 나선형으로 배치하기");
        int[][] answer = new int[n][n];
        int row = 0;
        int col = 0;
        int num = 1;
        int d = 0; // 이동 방향 0: 오른쪽, 1: 아래, 2: 왼쪽, 3: 위

        while (num <= n * n) {
            answer[row][col] = num++;

            // 다음 이동할 위치 계산
            switch (d) {
                case 0:
                    // 오른쪽으로로 끝까지 이동한 경우 || 다음 칸의 값이 이미 존재할 경우
                    if (col == n - 1 || 0 != answer[row][col + 1]) {
                        d = 1;
                        row++;
                    } else
                        col++;
                    break;
                case 1:
                    // 아래로 끝까지 이동한 경우 || 다음 칸의 값이 이미 존재할 경우
                    if (row == n - 1 || 0 != answer[row + 1][col]) {
                        d = 2;
                        col--;
                    } else
                        row++;
                    break;
                case 2:
                    // 왼쪽으로 끝까지 이동한 경우 || 다음 칸의 값이 이미 존재할 경우
                    if (col == 0 || 0 != answer[row][col - 1]) {
                        d = 3;
                        row--;
                    } else
                        col--;
                    break;
                case 3:
                    // 위로 끝까지 이동한 경우 || 다음 칸의 값이 이미 존재할 경우
                    if (row == 0 || 0 != answer[row - 1][col]) {
                        d = 0;
                        col++;
                    } else
                        row--;
                    break;
                default:
                    break;
            }

        }

        return answer;
    }

 

프로그래머스 문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

반응형