Published on

[코딩 테스트] 정수를 나선형으로 배치하기

Authors
  • avatar
    Name
    Younggyoung Lee
    Twitter

복습횟수: 🍎

문제 설명

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

제한사항

  • 1 ≤ n ≤ 30

입출력 예

nresult
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까지 숫자를 채울 수 있습니다.
행 \ 열0123
01234
11213145
21116156
310987

따라서 [[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까지 숫자를 채울 수 있습니다.
행 \ 열01234
012345
1161718196
2152425207
3142322218
3131211109

따라서 [[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 합니다.

답안

function solution(n) {
  // n x n 배열 초기화
  let array = new Array(n).fill().map(() => new Array(n).fill(0))

  let x = 0,
    y = 0
  let num = 1

  for (let i = n; i > 0; i -= 2) {
    if (i === 1) {
      array[y][x] = num
      break
    }

    // 오른쪽으로 이동
    for (let j = 0; j < i - 1; j++) array[y][x++] = num++
    // 아래로 이동
    for (let j = 0; j < i - 1; j++) array[y++][x] = num++
    // 왼쪽으로 이동
    for (let j = 0; j < i - 1; j++) array[y][x--] = num++
    // 위로 이동
    for (let j = 0; j < i - 1; j++) array[y--][x] = num++

    y++
    x++
  }

  return array
}
function spiralMatrix(n) {
  let matrix = Array.from({ length: n }, () => Array(n).fill(0))
  let x = 0,
    y = 0
  let dx = 0,
    dy = 1

  for (let i = 1; i <= n * n; i++) {
    matrix[x][y] = i
    let nextX = x + dx,
      nextY = y + dy

    if (0 <= nextX && nextX < n && 0 <= nextY && nextY < n && matrix[nextX][nextY] === 0) {
      x = nextX
      y = nextY
    } else {
      ;[dx, dy] = [dy, -dx]
      x += dx
      y += dy
    }
  }

  return matrix
}

느낀점

  • new Array(n).fill() 메서드를 배웠다.
  • for 문의 이해도가 필요했던 문제였다.
  • 생각보다 어려워서 계속 복습해봐야하는 문제.

References