// 보석 종류 파악 set. 굳이 요소 확인 필요 x. 갯수만 확인
function solution(gems){
// 결과 저장 배열, [시작 위치, 종료 위치]
let answer=[1, gems.length]
// 보석 종류 갯수
const gemTotal=new Set(gems).size;
// 현재 윈도우 내의 보석과 그 위치 저장하는 해시 맵
const gemMap=new Map();
for (let i=0;i<gems.length;i++){
// 현재 보석을 gemMap에서 삭제. 중복 보석이 있을 경우 마지막 위치만 저장하기 위함.
gemMap.delete(gems[i]);
// 현재 보석을 gemMap에 추가하거나 업데이트.
gemMap.set(gems[i], i);
// gemMap 크기가 gemTotal과 같아지면 현재 윈도우가 모든 종류의 보석을 포함하는지 확인
if (gemMap.size===gemTotal){
// gemMap의 가장 첫 번째 값을 가져오기
const candidateArray=[gemMap.values().next().value+1, i+1];
// 현재 구간이 더 짧으면 answer 업데이트
if (answer[1]-answer[0]>candidateArray[1]-candidateArray[0]){
answer=candidateArray;
}
}
}
return answer
}
내 코드 설명
주석 참고