getOrDefault()
: 해시 맵에 있으면 가져오고 없으면 default 반환하는 메소드
사용한 것
- 연속적으로 진열 된 보석을 구입할 때 모든 보석을 구매하기 위한 최소 구간을 구하기 위해 투 포인터 사용
- 보석이름, 구간별 보석의 수를 쌍으로 저장하기 위한 해시 맵
풀이 방법
- 투포인터를 사용하여 현재
r
의 개수를 증가
- while 문을 돌며
l
의 개수가 2 이상이면 감소, l++
- 모든 보석 종류를 모았고 이전에 구한 구간보다 길이가 짧으면
answer
교체
r++
코드
class Solution {
public int[] solution(String[] gems) {
Set<String> set1 = new HashSet<>(List.of(gems));
Set<String> set2 = new HashSet<>();
Map<String, Integer> map = new HashMap<>();
int l = 0;
int r = 0;
int len = Integer.MAX_VALUE;
int[] answer = new int[2];
while (r < gems.length) {
map.put(gems[r], map.getOrDefault(gems[r], 0) + 1);
set2.add(gems[r]);
while (map.get(gems[l]) > 1) {
map.replace(gems[l], map.get(gems[l]) - 1);
l++;
}
if (r - l < len && set1.size() == set2.size()) {
answer[0] = l + 1;
answer[1] = r + 1;
len = r - l;
}
r++;
}
return answer;
}
}