- Published on
[코딩 테스트] 정수를 나선형으로 배치하기
- Authors
- Name
- Younggyoung Lee
복습횟수: 🍎
문제 설명
양의 정수 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 |
3 | 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 합니다.
답안
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 문의 이해도가 필요했던 문제였다.
- 생각보다 어려워서 계속 복습해봐야하는 문제.