[programmers] 정수를 나선형으로 배치하기 - Java
양의 정수 'n'을 매개변수로 받아 'n' × 'n' 배열에 1부터 'n'²까지의 정수를 시계방향 나선형으로 배치하는 함수를 작성하는 문제입니다. 이를 해결하기 위해, 배열을 'n'의 제곱만큼의 크기로 선언하고, while문을 통해 값을 1씩 증가시키며 반복합니다. 동서남북 방향을 설정하고, 각 방향에 맞게 다음에 갈 좌표를 설정합니다.
Jan 23, 2024
문제 설명
양의 정수
n
이 매개변수로 주어집니다. n
× n
배열에 1부터 n
2 까지 정수를 인덱스 [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
- 예제 1번의
n
의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
행 \ 열 | 0 | 1 | 2 | 3 |
0 | 1 | 2 | 3 | 4 |
1 | 12 | 13 | 14 | 5 |
2 | 11 | 16 | 15 | 6 |
3 | 10 | 9 | 8 | 7 |
따라서 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]를 return 합니다.
입출력 예 #2
- 예제 2번의
n
의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.
행 \ 열 | 0 | 1 | 2 | 3 | 4 |
0 | 1 | 2 | 3 | 4 | 5 |
1 | 16 | 17 | 18 | 19 | 6 |
2 | 15 | 24 | 25 | 20 | 7 |
3 | 14 | 23 | 22 | 21 | 8 |
4 | 13 | 12 | 11 | 10 | 9 |
따라서 [[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 합니다.
solution.java
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; // 이동 방향 (0: 오른쪽, 1: 아래, 2: 왼쪽, 3: 위) 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 (direction == 3) { // 위쪽 방향으로 이동 if (row == 0 || answer[row - 1][col] != 0) { // 위쪽 값이 채워져 있다면 direction = 0; col++; } else { row--; } } } return answer; } }
핵심 키워드
- 배열을 n의 제곱만큼의 크기로 선언한다.
- while문을 통해 value가 해당 값이 될 때까지 1씩 증가시키며 반복한다.
- 0, 1, 2, 3을 각각 동서남북에 매칭해 방향을 설정하고, 각 방향에 맞게 다음에 갈 좌표를 설정한다.
결론!
처음 문제를 보고 나서 이해가 오랫동안 안되었고, 다음날까지 고민한 결과 인덱스의 증가마다 값의 규칙성을 찾기보다는, 이동한 자리에 해당하는 값을 1씩 증가시켜 대입하는 방식으로 문제를 해결할 수 있었다.
Share article