[programmers] 정수를 나선형으로 배치하기 - Java

양의 정수 'n'을 매개변수로 받아 'n' × 'n' 배열에 1부터 'n'²까지의 정수를 시계방향 나선형으로 배치하는 함수를 작성하는 문제입니다. 이를 해결하기 위해, 배열을 'n'의 제곱만큼의 크기로 선언하고, while문을 통해 값을 1씩 증가시키며 반복합니다. 동서남북 방향을 설정하고, 각 방향에 맞게 다음에 갈 좌표를 설정합니다.
Jan 23, 2024
[programmers] 정수를 나선형으로 배치하기 - Java

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [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

More articles

See more posts

👨🏻‍💻DriedPollack's Blog