이차원 배열 문제를 풀던 와중, 배열의 불변성을 지켜주지 못하는 경우가 생겼다.
기존 방법
기존 작성했던 방법을 설명하자면
n만큼의 2차원 배열을 생성해 0으로 채운다.
2차원 배열의 인덱스 i,j가 있는데 i와 j가 같은 경우에는 1로 바꾼다.
원하는 결과값은 [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
이였으나,
[ [ 1, 1, 1 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ]
이라는 값이 출력되었다.
const n = 3;
function solution(n) {
const newArr = Array.from({ length: n }).fill(
Array.from({ length: n }).fill(0)
);
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i === j) {
newArr[i][j] = 1;
}
}
}
return newArr;
}
console.log(solution(n));
이유는 각 배열의 모든 요소가 .fill() 메소드를 활용하면 같은 메모리를 참조하게 되어 불면성을 지켜주지 못해 발생한 문제이다.
Array.from()의 두번째 배개변수를 활용해서 아래 코드와 같이 수정하면
각각 요소들이 불변성을 유지하게 된다.
const n = 3;
function solution(n) {
const newArr = Array.from({ length: n }, () => Array.from({ length: n }).fill(0));
for (let i = 0; i < n; i++) {
for (let j = 0; j < n; j++) {
if (i === j) {
newArr[i][j] = 1;
}
}
}
return newArr;
}
console.log(solution(n));