https://leetcode.com/explore/learn/card/fun-with-arrays/525/inserting-items-into-an-array/3245/
주어진 배열의 요소가 0이면 0을 더 추가하되 기존 배열의 length 는 유지해야한다.
주어진 배열을 수정하라고 해서(modify arr in-place instead)
answer 이라는 배열을 만든 후 값을 넣어주고
마지막에 arr.length = 0; 을 하여 arr을 빈 배열로 만든 후
answer 의 주소를 같이 참조하게끔 처리하려고 했다. (arr = answer;)
그런데..계속 wrong answer이 나왔고 출력값을 보니 빈 배열이었다.
같은 코드를 vscode로 작성하여 실행시켰을 땐 console.log로 찍은 결과가 [1,0,0,2,3,0,0,4] 로 정답과 동일했다.
도통 이해가 가질 않아서 개발자 도구에 비슷한 코드를 작성하여 콘솔을 찍어봤지만..
let arr = [1,2,3,4];
let arr2 = [5,6,7,8];
arr.length = 0;
arr = arr2;
console.log(arr); // [5,6,7,8]
console.log(arr2); // [5,6,7,8]
arr와 arr2이 같은 주소를 참조하는 것을 확인할 수 있었다.
이게 도대체 무슨 일인가..
리트코드는 왜 틀렸다고 하는가..
왜 빈배열이 나오는가.....
이해가 안 돼서 결국 질문행..😑😑😑
다른 개발자 분이 주신 답변을 보고 이해했다.
duplicateZeros가 보고 있는 arr 이라는 변수가 가리키는 배열이 바뀐 것이지
duplicateZeros를 실행한 쪽이 보고 있는 배열은 변하지 않는 것이기 때문.
궁금한 건 못참으니 직접 테스트해봄
주어진 파라미터를 직접 수정하라는 문제는 처음 겪어봤는데...
여태껏 당연히 실행되는 함수 내에서 뭔가를 처리하고 리턴시키는 것으로 생각했지(그리고 그 함수 내의 변수들만 신경씀)
실행시키는 쪽의 값까지 신경써야한다는 생각은 전혀 하지 못했다. 쏘 충격.,
암튼! 해당 문제는 arr splice() 함수와 pop() 함수를 통해 arr의 값을 직접 변경하는 쪽으로 접근해서 풀었다.
풀이
var duplicateZeros = function(arr) {
for(let i = 0; i < arr.length; i++){
if(arr[i] === 0 ){
arr.pop();
arr.splice(i+1,0,0);
i++;
}
}
}
참고로
splice() 는 기존 배열을 삭제 하는 것 뿐만아니라, 교체 또는 새 요소를 추가하려 배열의 내용 변경 가능하다!!! (이것도 간과하고 있었음)
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
[프로그래머스] 공원 산책 (0) | 2023.04.04 |
---|---|
[리트코드] Remove Element (0) | 2023.03.31 |
[프로그래머스] 구슬을 나누는 경우의 수 (0) | 2022.11.20 |
[프로그래머스] 소인수분해 (0) | 2022.11.17 |
[프로그래머스] 최빈값 구하기 (0) | 2022.11.14 |
댓글 영역