[프로그래머스][Level3] 보석쇼핑

다돔잉·2020년 10월 24일
0

Map과 Set

Map

Es6 이전)

  • 객체로 표현했을 때, 프로토타입 체인때문에 의도치않은 연결이 생길 수 있음
  • 키와 값이 몇 개인지 알 수 없음
  • 키는 반드시 문자열이나 Symbol이어야하기 때문에 객체를 키로 써서 값을 연결하지 못함
  • 객체는 프로퍼티 순서를 보장하지 않음
const u1 = {name: 'dasom', age: 22}
const roles = new Map();
roles.set(u1, 'user');


key > Object(u1)
value > String('user')

  • Map은 key에 Object, string, symbol 사용 가능
  • iterable
  • 함수
const map = new Map();
map.set({name: 'dasom', age: '22}, 'user');
map.values(); 		// MapIterator {"user"}
[...map.values()] 	// ["user"]
map.values().next() 	// {value: "user", done: false}
map.keys(); 		// MapIterator {{…}} > {name: 'dasom', age: '22}
[...map.keys()] 	// [{name: 'dasom', age: '22}]
maps.keys().values()	// {value: {…}, done: false}
map.size 		// 1
map.has({name: "dasom", age: 22}) // false => 객체는 안되는 모양이다
map.set('a', 'user');
map.has('a') 		// true
map.has('b') 		// false
map.delete('a')		// 삭제됨
map.clear()		// map이 삭제됨

WeakMap

  • 키는 반드시 객체 이어야 함
  • WeakMap의 키는 가비지컬렉션에 포함될 수 있음
    가비지 컬렉션 ; 자바스크립트는 코드 어딘가에서 객체를 참조하는 한 그 객체를 메모리에 유지함. 자바스크립트에서 가비지컬렉션은 언제 일어나는지 알 수 없음 -> 때문에 이터러블할 수 없다
  • 이터러블이 아니며 clear() 메서드 없음

Set

  • 중복을 허용하지 않는 데이터 집합
const arr= ['a', 'b', 'c', 'd', 'a', 'b'];
const set = new Set(arr); // Set(4) {"a", "b", "c", "d"}
set.add({name: "dasom", age: 22}, 'user');
set.add({name: "dasom", age: 22}, 'user');
// Set(6) {"a", "b", "c", "d", {…}, {…} -> 객체는 안되는 모양
[...set]; // ["a", "b", "c", "d", {…}, {…}]
set.has('a') // true

WeakSet

  • 객체만 포함
  • 가비지컬렉션의 대상이 됨

코드

function solution(gems) {
    var answer = [];
    var answer_list = [];

    let distinct = [...new Set(gems)];
    let map = new Map();
    let min = 1000000;

    for(let i=0; i<gems.length; i++){
        if(map.has(gems[i])){
            map.delete(gems[i]);
        } 
        map.set(gems[i], i);
        if(map.size === distinct.length){
            answer_list.push([map.values().next().value + 1, i + 1]);
        }
    }

   answer_list.sort((a, b)=>{
       return (a[1]-a[0])-(b[1]-b[0]);
   })
    return answer_list[0];
}
  • min을 이용해서 비교하고 push하고 가장 낮은 애를 return하는 방법으로 풀었었는데 효율성에서 자꾸 틀렸다.
  • 딱 이렇게 풀어야 효율성까지 통과하는 것 같다.
  • map에대해 완전히 알고 있어야 풀 수 있는 문제였다. 어려웠음ㅜㅜ
profile
안녕

0개의 댓글