본문 바로가기
JAVA/프로그래머스

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

by ♡˖GYURI˖♡ 2024. 4. 30.
 

프로그래머스

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

programmers.co.kr

 

 

 

 

이해하기

어렵지 않은 문제라고 생각했는데, 접근법을 전혀 떠올리지 못했다.

 

⬇️참고한 블로그

 

[프로그래머스] 정수를 나선형으로 배치하기 | Java - 민민의 하드디스크 - 티스토리

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

2minmin2.tistory.com

 

풀이 방법은 다음과 같다.

  • while문을 돌며 n * n 만큼 채울 때까지 반복한다.
    • answer[row][col]에 value를 넣은 후 value++ 해준다.
    • direction으로 움직일 방향을 판단한다.
      • 0 = 오른쪽
      • 1 = 아래쪽
      • 2 = 왼쪽
      • 3 = 위쪽
    • direction == 0일 때
      • col == n - 1 : 열의 끝까지 이동
      • answer[row][col + 1] != 0 : 오른쪽으로 한 칸 더 갔을 때의 값이 0이 아닐 경우 (이미 채워진 경우)
        • direction을 1로 바꾸고
        • row++
      • 위의 경우가 아니라면 col++
    • direction == 1일 때
      • row == n - 1 : 행의 끝까지 이동
      • answer[row + 1][col] != 0 : 아래쪽으로 한 칸 더 갔을 때의 값이 0이 아닌 경우 (이미 채워진 경우)
        • direction을 2로 바꾸고
        • col--
      • 위의 경우가 아니라면 row++
    • direction == 2일때
      • col == 0 : 열의 왼쪽 끝까지 이동
      • answer[row][col - 1] : 왼쪽으로 한 칸 더 갔을 때의 값이 0이 아닌 경우 (이미 채워진 경우)
        • direction을 3으로 바꾸고
        • row--
      • 위의 경우가 아니라면 col--
    • direction == 3일 때
      • row == 0 : 행의 맨 위까지 이동
      • answer[row-1][col] : 위쪽으로 한 칸 더 갔을 때의 값이 0이 아닌 경우 (이미 채워진 경우)
        • direction을 0으로 바꾸고
        • col++
      • 위의 경우가 아니라면 row--

 

 

문제풀이

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int value = 1;
        int row = 0;
        int col = 0;
        int direction = 0;
        
        while (value <= n * n) {
            answer[row][col] = value++;
            
            if (direction == 0) {
                if (col == n - 1 || answer[row][col + 1] != 0) {
                    direction = 1;
                    row++;
                } else {
                    col++;
                }
            } else if (direction == 1) {
                if (row == n - 1 || answer[row + 1][col] != 0) {
                    direction = 2;
                    col--;
                } else {
                    row++;
                }
            } else if (direction == 2) {
                if (col == 0 || answer[row][col - 1] != 0) {
                    direction = 3;
                    row--;
                } else {
                    col--;
                }
            } else {
                if (row == 0 || answer[row - 1][col] != 0) {
                    direction = 0;
                    col++;
                } else {
                    row--;
                }
            }
        }
        
        return answer;
    }
}