2차원 정수 배열 matrix
오른쪽, 아래, 왼쪽, 위 방향으로 진행되는
spiral order에 따라 순회한 결과를
배열로 반환
/**
* @param {number[][]} matrix
* @return {number[]}
*/
var spiralOrder = function(matrix) {
let res = [];
let m = matrix[0].length;
let n = matrix.length;
let total = m * n;
let cnt = 0;
let x = 0;
let y = 0;
while (cnt < total) {
for (let i = y; cnt < total && i < m - y; i++) {
res.push(matrix[x][i]);
cnt++;
}
x++;
for (let j = x; cnt < total && j <= n - x; j++) {
res.push(matrix[j][m - y - 1]);
cnt++;
}
y++;
for (let k = m - y - 1; cnt < total && k >= y - 1; k--) {
res.push(matrix[n - x][k]);
cnt++;
}
for (let l = n - x - 1; cnt < total && l >= x; l--) {
res.push(matrix[l][y - 1]);
cnt++;
}
}
return res;
};
오른쪽, 아래, 왼쪽, 위 방향으로 전진하는 것을 4개의 for문으로 나타냄
이를 모든 요소를 다 돌때까지 (total과 cnt로 판단) 반복
요소를 다 확인했을 때 (total === cnt) 반복을 멈춰야하기 때문에 모든 조건에 cnt < total을 달았음
x와 y는 한 방향을 모두 지나쳤을 때 다시 지나가지 않도록 경계선을 계산하는 역할
한 바퀴를 돌 때마다 x와 y가 하나씩 증가
Accepted
Runtime 50ms (Beats 63.61%)
Memory 48.31MB (Beats 85.75%)
네 방향으로 도는 것을 while 문으로 반복해야 된다는 것은 바로 생각이 났는데, 그 경계선에 대한 조건을 어떻게 줘야할까 하다가 처음에는 지나간 부분을 다 배열에서 삭제하는 방식으로 구현했었다. 그랬더니 여기저기서 참조 에러가 나길래 포기하고 변수를 늘려서 활용하는 방법을 선택했다. 확실히 변수가 늘어나니 계산하기가 복잡해져서 좀 헤맸다. 특히 다 완성하고 나서 제출을 했는데 시간 초과가 나길래 수기로 하나하나 값을 대입해보면서 계산하니 틀린 부분이 없었다. 도대체 무슨 일인가 싶어 한참을 시간을 보내고 이럴리가 없다면서 재제출을 하니 글쎄 통과했다... 다들 이런 일이 없기를 바라며, for문의 조건을 설명하기가 꽤나 어려워서 코드 설명에 길게 안 달았는데 직접 matrix와 방향을 그리면서 이해해보면 좋을 것 같다.