상세 컨텐츠

본문 제목

[리트코드] Duplicate Zeros

Programming/Algorithm

by 겨리! 2023. 3. 30. 00:09

본문



https://leetcode.com/explore/learn/card/fun-with-arrays/525/inserting-items-into-an-array/3245/

Explore - LeetCode

LeetCode Explore is the best place for everyone to start practicing and learning on LeetCode. No matter if you are a beginner or a master, there are always new topics waiting for you to explore.

leetcode.com

 
주어진 배열의 요소가 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

Array.prototype.splice() - JavaScript | MDN

splice() 메서드는 배열의 기존 요소를 삭제 또는 교체하거나 새 요소를 추가하여 배열의 내용을 변경합니다.

developer.mozilla.org

 
 

관련글 더보기

댓글 영역