javascript 배열을 매개변수로 전달시 주의할점

DY·2023년 1월 10일
0

CS

목록 보기
10/10

상황

https://school.programmers.co.kr/learn/courses/30/lessons/17680#
프로그래머스 위의 문제를 풀던중 오류를 찾던중에 잘못알고있던점을 알게 되었다.

  • 함수의 매개변수로 배열을 전달할때 해당 배열에 새로운 배열을 할당했을경우
let arr = [1, 2, 3];

function modifyArray(arr) {
  arr.push(4);
}

modifyArray(arr);
console.log(arr); // [1, 2, 3, 4]

function newArray(arr) {
    arr = [5, 6, 7];
}

newArray(arr);
console.log(arr); // [1, 2, 3, 4]

고찰

  • javascript는 함수 호출시 해당 배열을 가리키는 변수는 호출전의 배열 주소값 그대로를 가지고 있는거고 함수안에서 해당 변수에 새로운 배열이 할당이 되더라도 호출한곳의 배열변수는 원래의 주소값을 계속 가리키고 있기 때문에 배열이 변하지 않는것이다.
  • c언어는 새로운 배열을 할당할수 없는데 이러한 사용자의 실수를 막기 위해서이지 않을까 싶다.

해결

  • 오류코드
function solution(cacheSize, cities) {
    
    // ["a", "b", "c", "a", "b", "d", "c"]
    // a b c 
    // b c a
    // c a b
    // a b d
    // b d c
    
    
    
    if(cacheSize === 0)
        return cities.length * 5;
    
    let runtime = 0;
    let arr = []
    for(let i = 0; i <cities.length; i++){
        cities[i] = cities[i].toLowerCase();
        runtime += searchIndex(arr,cities[i],cacheSize);
        console.log(arr);
    }
    return runtime;
}

function searchIndex(arr, word, cacheSize){
    let index = arr.indexOf(word);
    if(index === -1){
        if(cacheSize === arr.length){
            arr.shift();
            arr.push(word);
        }
        else arr.push(word);
        
        return 5;
    }
    else {
        _switch(arr, index);
        return 1;
    };
}

function _switch(arr, a){
    arr = [...arr.slice(0,a),...arr.slice(a+1), arr[a]];
}
  • slice -> splice로 변경해서 사용
function _switch(arr, a){
    let temp = arr[a];
    arr.splice(a,1);
    arr.push(temp);
}
profile
화면에 보이는 모든것에 관심이 있습니다. 개발하면서 고민했던것들, 공부했던걸 기록하는 저장소입니다.

0개의 댓글