2차원 M x N 배열을 나선형(spiral)으로 순회해야 합니다.
let matrix = [
['A', 'B', 'C'],
['D', 'E', 'F'],
['G', 'H', 'I'],
];
let output = spiralTraversal(matrix);
console.log(output); // --> 'ABCFIHGDE'
const spiralTraversal = function (matrix) {
let breakpoint = 0;
let x = [0, 1, 0, -1];
let y = [1, 0, -1, 0];
let xyOrder = 0;
let [dx, dy] = [0, 0];
let answer = matrix[dx][dy];
const isValid = (rx, cy) =>
rx >= 0 && cy >= 0 && rx <= matrix.length - 1 && cy <= matrix[0].length - 1;
const visited = Array.from({ length: matrix.length }, () =>
Array(matrix[0].length).fill(0)
);
visited[dx][dy] = 1;
function repeat(repeatLen, idxK) {
if (breakpoint === 2) return;
for (let i = 0; i < repeatLen; i++) {
let [nx, ny] = [dx + x[idxK], dy + y[idxK]];
if (isValid && visited[nx][ny]) {
breakpoint++;
break;
} else {
breakpoint = 0;
[dx, dy] = [nx, ny];
visited[dx][dy] = 1;
answer += matrix[dx][dy];
}
}
idxK = (idxK + 1) % 4;
if (idxK === 0 || idxK === 2) repeat(matrix[0].length - 1, idxK);
else repeat(matrix.length - 1, idxK);
}
repeat(matrix[0].length - 1, xyOrder);
return answer;
};
방법1
const arr1 = Array.from(Array(rows), () => new Array(columns)); const visited = Array.from(Array(matrix.length), () => new Array(matrix[0].length).fill(0));
방법2
Array(9).fill().map(()=>Array(9).fill())
방법3
Array.from({length: 20}, () => Array(10).fill(0))
//TODO 이중배열 만들기
{
let max = 3;
let matrixArr1 = Array.from(Array(max), () => Array(max).fill(0));
let matrixArr2 = Array.from({ length: max }, () => Array(max).fill(0));
let matrixArr3 = Array(max).fill(Array(max).fill(0));
}