// arr[5][3] (빈 배열 생성)
const arr1 = Array.from(Array(5), () => new Array(3)
// arr[5][3] (null로 초기화하여 생성)
const arr2 = Array.from(Array(5), () => Array(3).fill(null))
(n * n) 크기의 2차월 배열 생성
1의 배열을 패턴대로 순회하며 값 채우기
2-1. direction (진행방향)
y 그대로, x++ (0 ~ n-1)
x 그대로, y++ (0 ~ n-1)
y 그대로, x-- (n-1 ~ 0)
x 그대로, y-- (n-1 ~ 0)
2-2. move (진행정도)
n=3 일 때
3 -> 2 -> 2 -> 1
1 -> 0
n=4 일 때
4 -> 3 -> 3 -> 2
2 -> 1 -> 1 -> 0
n=5 일 때
5 -> 4 -> 4 -> 3
3 -> 2 -> 2 -> 1
1 -> 0
n=6 일 때
6 -> 5 -> 5 -> 4
4 -> 3 -> 3 -> 2
2 -> 1 -> 1 -> 0
function solution (n) {
const base = Array.from(Array(n), () => Array(n).fill(null));
let x = 0, y = 0; // 2차원 배열의 행, 열
let move = n-1; // 한 번에 값을 채워넣을 횟수
let num = 1; // 2차원 배열에 채워 넣을 값 (1~n)
while (num <= n*n) {
// n 이 홀수인 경우, 중앙의 한 값을 채운다 (n=5 일 때 [2,2])
if(x === (n-1)/2 && y === (n-1)/2) {
base[x][y] = num++
}
for (let i=0; i<move; i++) {
base[x][y] = num++
y++;
}
for (let i=0; i<move; i++) {
base[x][y] = num++
x++;
}
for (let i=0; i<move; i++) {
base[x][y] = num++
y--;
}
for (let i=0; i<move; i++) {
base[x][y] = num++
x--;
}
move -= 2;
x++
y++
}
return base;
}