Given a positive integer n, generate an n x n matrix filled with elements from 1 to n2 in spiral order.
1 <= n <= 20Example 1:

Input: n = 3
Output: [[1,2,3],[8,9,4],[7,6,5]]
Example 2:
Input: n = 1
Output: [[1]]
n = 2
[[1,2], [4,3]]
n= 3
[[1,2,3],[8,9,4],[7,6,5]]
n=4
[[1,2,3,4][12,13,14,5] [11, 16, 15, 6] , [10, 9, 8, 7]]
하지만 실패했다.
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
const matrix = Array(n).fill().map(() => Array(n).fill(0)); // n x n matrix filled with 0s
let num = 1, start = 0, end = n - 1;
while (start <= end) {
for (let j = start; j <= end; j++) {
matrix[start][j] = num++; // top row
}
for (let i = start + 1; i <= end; i++) {
matrix[i][end] = num++; // right column
}
for (let j = end - 1; j >= start; j--) {
matrix[end][j] = num++; // bottom row
}
for (let i = end - 1; i > start; i--) {
matrix[i][start] = num++; // left column
}
start++;
end--;
}
return matrix;
};
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function(n) {
let matrix = [];
let nums = [];
for (let i = 0; i < n; i++) {
matrix[i] = [];
}
for (let i = 1; i <= n * n; i++) {
nums.push(i);
}
nums.reverse();
let top = 0;
let left = 0;
let right = n - 1;
let bottom = n - 1;
let addElement = (row, columm) => {
matrix[row][columm] = nums.pop();
};
while (nums.length) {
for (let i = left; i <= right && nums.length; i++) {
addElement(top, i);
}
top++;
for (let i = top; i <= bottom && nums.length; i++) {
addElement(i, right);
}
right--;
for (let i = right; i >= left && nums.length; i--) {
addElement(bottom, i);
}
bottom--;
for (let i = bottom; i >= top && nums.length; i--) {
addElement(i, left);
}
left++;
}
return matrix;
};

규칙은 이미 문제에서 파악하기 쉽게 나와있어서 규칙을 파악하는데 시간을 쓰진 않았다. 하지만 그 규칙을 응용할 생각을 해야지, 규칙을 코드로 작성할 능력이 부족하다고 다른 방법으로 만들려고 했기 때문에 겪었던 문제였다.
array.map(function(currentValue, index, arr), thisValue)
map()에 전달되는 콜백 함수는 최대 세 개의 인자(currentValue, index, arr)를 받을 수 있다.
이때 이 인자들을 모두 사용할 수도 있고, 일부만 사용하거나 아예 사용하지 않을 수도 있다. 아무런 인자를 받지 않는다는 것은 그 콜백 함수가 아무런 인자를 사용하지 않는다는 것을 의미한다.
하지만 세 가지 인자 중 어느 것을 실제로 사용할지는 map()에 전달하는 콜백 함수에 달려있다.