[코딩테스트연습] 코딩 기초 트레이닝 > Lv.0 정수를 나선형으로 배치하기

2024. 3. 9. 20:46코딩 테스트/[프로그래머스] Java

문제 설명


문제 풀이

가장 먼저 떠올랐던 아이디어는 각 행과 열을 지정해서 순서대로 입력해야 할 것 같았다.

 

/*
1. 0번째 행: 1~n(n-1개)까지 순서대로
2. n-1번째 열: n~n+(n-1)개까지 순서대로
3. n-1번째 행: n+(n-1) ~ (n+(n-1))+(n-1)까지 역순으로
4. 0번째 열: (n+(n-1))+(n-1) ~ ((n+(n-1))+(n-1))+(n-1-1)까지 순서대로
5. ...
*/

 

위 아이디어를 떠올려봤는데 너무 규칙성이 없어 보였다..

하나하나 하드코딩하는 것 같아서, 왠지 이 방법이 아닌 것 같았다.

따라서 다른 아이디어를 계속 고민해 보았다!

 

두번째 아이디어는 인덱스와 숫자 사이에 규칙성이 있는지 확인해보기이다.

이를 확인하기 위해서는 각 인덱스별 숫자값을 써보고, 눈으로 규칙이 있나 없나 확인해 볼 수 있었다.

 

If n = 4, 
[0][0] = 1

[0][1] = 2

[0][2] = 3

[0][3] = 4

--------------

[1][3] = 5

[2][3] = 6

[3][3] = 7

--------------

[3][2] = 8

[3][1] = 9

[3][0] = 10

--------------

[2][0] = 11

[1][0] = 12

--------------

[1][1] = 13

[1][2] = 14

--------------

[2][2] = 15

--------------

[2][1] = 16

--------------

 

여기서 찾을 수 있었던 규칙이 하나 있었다.

행 고정 & 열 순차적으로 변경 > 열 고정 & 행 순차적으로 변경 > 반복 ...

 

여기서 더 파고 들어가서 다른 규칙을 찾아보았다.

0행 고정 & 0,1,2, ..., n-1열까지 변경 > n-1열 고정 & 1,2, ..., n-1열까지 변경 >

n-1행 고정 & n-2, n-3, ... 0열까지 변경 > 0열 고정 & n-2, n-3, ... 1까지 변경 >

1행 고정 & 1,2, ... n-2열까지 변경 > n-2열 고정 & ...

 

즉, 처음 행을 고정해 놓은 이후부터는 다음 행부터 진행되고, 고정된 이후 행은 값을 더이상 채우지 않아도 된다.

이를 나타내주기 위해 각 인덱스를 변수로 놓고 증가시켜주었다. 다음은 코드로 작성한 것이다.

 

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

        int count = 1;
        int row = 0; 
        int row_end = n - 1; 
        int col = 0; 
        int col_end = n - 1; 

        while (count <= n * n) {
            // 좌>우
            for (int i = col; i <= col_end; i++) {
                answer[row][i] = count++;
            }
            row++; 

            // 상V하
            for (int i = row; i <= row_end; i++) {
                answer[i][col_end] = count++;
            }
            col_end--; 

            // 좌<우
            for (int i = col_end; i >= col; i--) {
                answer[row_end][i] = count++;
            }
            row_end--; 

            // 상^하
            for (int i = row_end; i >= row; i--) {
                answer[i][col] = count++;
            }
            col++; 
        }
        
        return answer;
    }
}