[TIL] new Array().fill()로 값 할당할 때 주의점

박먼지·2023년 10월 20일
0
post-thumbnail

백준 1149번 RGB거리 문제를 푸는데
점화식은 맞았는데 자꾸 값이 이상하게 나오는 것이다.🤯

그래서 for문에 console을 찍어봤는데 나는 분명 첫번째 배열 요소에 값을 넣었는데 2번째 배열 요소에도 똑같은 값이 들어간 것이였다!

let dp = new Array(N).fill([Infinity, Infinity, Infinity]);

dp[0] = cost[0];

for (let i = 1; i < N; i++) {
  dp[i][0] = Math.min(dp[i - 1][1] + cost[i][0], dp[i - 1][2] + cost[i][0]);
  dp[i][1] = Math.min(dp[i - 1][0] + cost[i][1], dp[i - 1][2] + cost[i][1]);
  dp[i][2] = Math.min(dp[i - 1][0] + cost[i][2], dp[i - 1][1] + cost[i][2]);
}

전부 Infinity로 초기화했지만, 첫번째 요소로 for문이 순회하는 중인데도 나머지 다른 배열이 채워져있는 괴현상이 일어난 것이다.🫠

내가 기대한 값은

첫번째 요소만 채우고 나머지가 Infinity로 남아있는 것이였다.

그래서 구글링을 해보니까 fill 메서드가 얕은 복사로 값을 채우기 때문에 배열이 들어가게 되면 모든 배열이 같은 참조값을 바라본다는 것이였다.

따라서 내가 첫번째 배열에 값을 넣었으면 나머지 배열에도 값이 들어가는 것이다!!!(메모리 주소 값이 같으므로)

그래서 1차원 배열에서 나지 않았던 오류가 2차원 배열에서 나게 된 것이다...

그러면 어떻게 초기화를 하느냐

let dp = Array.from({ length: N }, () => [Infinity, Infinity, Infinity]);

이렇게 초기화 하면 전부 다른 참조값을 가진 2차원 배열을 만들 수 있다.

교훈)
자바스크립트 메서드를 잘 알고 쓰자..

참조
https://aeunhi99.tistory.com/257

profile
개발괴발

0개의 댓글