https://programmers.co.kr/learn/courses/30/lessons/67258
function solution(gems) {
let answer = [0, Number.MAX_SAFE_INTEGER];
const totalLen = new Set([...gems]).size;
const map = new Map();
let lo = 0;
for (let hi = 0; hi < gems.length; ++hi) {
map.set(gems[hi], map.get(gems[hi]) + 1 || 1);
if (map.size === totalLen && answer[1] - answer[0] > hi - lo)
answer = [lo, hi];
while (map.size === totalLen) {
if (map.get(gems[lo]) === 1) map.delete(gems[lo]);
else map.set(gems[lo], map.get(gems[lo]) - 1 || -1);
if (answer[1] - answer[0] > hi - lo) answer = [lo, hi];
++lo;
}
}
return answer.map((a) => a + 1);
}
투 포인터 알고리즘을 사용하였다.
우선 보석의 종류가 총 몇 개인지 totalLen
에 Set.size
을 이용하여 저장한다.
투 포인터 알고리즘은 다음과 같은 방식으로 반복한다.
gems[hi]
의 보석을 map
에 넣으면서 +1 을 해준다.answer
의 값을 업데이트 해준다.map
에 gems[lo]
에 해당하는 값을 -1을 해주는데 만약 1이면 키값을 삭제하면서 answer
값을 업데이트 해준다.