알고리즘 문제 풀기/실수축제

프로그래머스: 순위 검색 - 실수 축제 (map 객체에 값 추가하기, replace)

Fo_rdang 2024. 8. 24. 10:31
반응형

문제 코드 

for(let candi of candi_key){
            if(!map.has(candi)) map.set(candi, [])
            let arr = map.get(candi).push(score) //틀린 부분
            map.set(candi, arr)
        }

 

틀린 이유 

map.get(candi).push(score)가 배열의 'push' 메서드인데, 이 메서드는 호출한 배열의 길이를 반환한다. 

즉, arr에는 배열이 아니라 score가 추가된 후 배열의 길이가 할당된다. 

따라서, map.set(candi, arr) 를 할 필요가 없다. 

그냥 push 메서드로 배열에 값을 추가하면 된다. 

왜냐하면 배열은 이미 참조로 연결되어 있으므로 map에 다시 설정할 필용없다. 

결론) 단순히 push 메서드를 호출하는 것만으로도 충분하다. 

 

해결 코드 

for(let candi of candi_key){
    if(!map.has(candi)) map.set(candi, [])
    map.get(candi).push(score)
}

 

Map 객체의 값이 숫자인 상황에서, 숫자값을 더할 때는?

예를 들어 map.get(key) += 2 이것이 안된다. 

왜냐하면 map.get(key)가 단순 값을 반환하기 때문임 

js에서는 primitive 타입 (예: 숫자, 문자열, 불리언)은 immutable하다. 

- 값이 변경되지 않으며, 연산을 통해 변경된 값을 저장하려면 새로 할당해야 한다. 

 

정리

1. primitive 타입은 값에 의한 복사 

: map.get(key) 로 반환된 값이 숫자라면, 이는 복사본이다. 이 복사본에 += 연산을 하더라도 Map 에 저장된 값이 바뀌지 않는다. 그 결과 map.set(key, map.get(key) +2) 와 같은 식으로 다시 Map 에 저장을 해야한다. 

2. 참조 타입은,

배열이나 객체 같은 참조 타입의 경우에는 map.get(key)로 반환된 값이 실제 참조를 가리킨다. 이 경우, 참조된 객체나 배열의 내용을 수정하면 원본이 바로 변경된다. 예를 들어, map.get(key).push(value)는 Map의 값인 배열을 직접 수정한다. 

 

 

비슷한 실수 

- replace는 원본 문자열을 수정하지 않는다. 따라서 수정된 문자열을 다시 할당해야 한다.  

반응형