ES6부터 등장한 Map객체를 이용하여, [보석이름,인덱스]로 매핑해주고, 같은 보석이 등장할 경우엔 기존 보석을 delete해주고, 다시 최신 인덱스로 갱신하여 매핑해준다.
function solution(gems) {
var answer = [];
let size = new Set(gems).size;
let map = new Map()
let ansArr = [];
for(var i =0; i<gems.length; i++){
//기존의 보석이 등장하였을 경우 삭제하고, 다시 갱신해준다.
map.delete(gems[i]);
map.set(gems[i],i);
if(map.size === size){
let val = [map.values().next().value+1, i+1]
ansArr.push(val);
}
}
//ansArr를 sort해주는 조건은 우선 두 값사이 차이가 적은걸로 sort해주고
//만약 차이가 같다면, 앞에있는 숫자가 작은걸 우선적으로 sort하도록 한다.
ansArr.sort((a,b)=>{
if((b[1] - b[0]) === (a[1]-a[0])){
return a[0] > b[0] ? 1 : -1
}else{
return (a[1] - a[0]) > (b[1] - b[0])? 1 : -1
}
})
return answer = ansArr[0]
}
이전에 map객체를 사용하는데, 이해가 잘 되지않았어서 제대로 사용하지 않았다. 이번 문제를 풀면서 map객체를 다시 정리하였고, 중복 보석을 삭제하고, 최신의 인덱스로 갱신해주는 방법도 좋은 방법이라고 느꼈다.