
Input: matrix = [[1,1,1],[1,0,1],[1,1,1]]
Output: [[1,0,1],[0,0,0],[1,0,1]]
2차원 배열에서 값이 0일 때 행과 열을 0으로 바꾸면 되는데
return 값 없이 matrix를 바로 바꾸면 된다.
const setZeroes = function (matrix) {
const arr = [...matrix];
let y = null;
for (let i = 0; i < matrix.length; i++) {
let x = null;
for (let j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] === 0) {
x = i;
y = j;
if (x > -1) arr[i] = Array.from({ length: matrix[i].length }).fill(0);
}
}
}
if (y > -1) {
matrix.forEach((v, i) => arr[i][y] = 0)
}
matrix = arr;
return matrix;
};
처음에 객체 복사해서 이렇게 풀었다가 콘솔에는 맞게 나오지만 result에 다르게 나와서 다시 풀었다.
const setZeroes = function (matrix) {
let firstX = false;
let firstY = false;
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] === 0) {
if (i === 0) firstX = true;
if (j === 0) firstY = true;
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
for (let i = 1; i < matrix.length; i++) {
for (let j = 1; j < matrix[i].length; j++) {
if (matrix[0][j] === 0 || matrix[i][0] === 0) {
matrix[i][j] = 0;
}
}
}
if (firstX || firstY) {
matrix.map((v, i) => {
if (i === 0 && firstX) matrix[i] = Array.from({length: v.length}).fill(0)
v.map((col, j) => {
if (j === 0 && firstY) return v[j] = 0;
})
})
}
return matrix;
};
처음에 돌면서 firstX, firstY로 0에 관한 정보를 저장하고
그 다음에는 다시 돌면서 0일 때 값을 바꿔주고
i === 0이거나 j === 0의 값은 따로 마지막에 체크해서 값을 또 바꿔준다.