[프래그래머스 알고리즘] 보석쇼핑 JavaScript JS

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

😉문제 풀이 설명

개인적으로 조금 어려웠던 문제였습니다.

이 문제는 Map 객체를 쓰지 않고는 어떻게 풀 방법이 생각나지 않네요.

이번에 배웠던 점은 map.value().next() 함수를 통해서 Map을 Queue와 같은 형태로 사용할 수 있다는 점입니다.

Map 객체를 Queue의 형태로 사용할 수 있으면서 동시에 key값으로 원하는 값을 가질 수 있어 데이터를 찾는데 배열을 순회하는 형식O(n)이 아닌 한번에 찾을 수 있는 점O(1)을 배울 수 있었습니다.

 

Map.prototype.values() - JavaScript | MDN

values() 메서드는 배열의 각 아이템의 값을 순회하는 새로운 맵 반복자 (en-US) 객체를 반환합니다.

developer.mozilla.org

map객체의 values()메서드, keys() 메서드는 “이터레이터 오브젝트”를 반환하기 때문에, 순서를 알 수 있고 이를 통해 Queue와 같은 형태로 사용가능 합니다.

이를 활용하면 정말 쉽게 풀 수 있습니다!


😎문제 풀이 코드

function solution(gems) {
    const map = new Map()
    const num_goal = [...new Set(gems)].length
    const answer_arr = [];

    gems.forEach((gem,index)=>{
        map.delete(gem) //map.values().next()가 정상 작동하기 위해서 삭제해준다.
        map.set(gem,index)
        if(map.size === num_goal)
            answer_arr.push([map.values().next().value+1, index+1])
    })

    return answer_arr.sort((a,b)=> (a[1]-a[0])-(b[1]-b[0]))[0] 
}

map.delete()를 통해 기존 값을 지워주지 않으면, 기존의 키 값에 할당되기 때문에 Queue의 형태로 진행되지 않는다는 점만 유의하면 되겠습니다.