1. 문제 풀이 아이디어
Set
을 사용해 보석의 모든 종류 수를 구하고,Map
과 두 포인터를 활용해 원하는 구간을 찾아 문제를 해결할 수 있다.
2. 나의 정답 코드
class Solution {
public int[] solution(String[] gems) {
int size = new HashSet<String>(Arrays.asList(gems)).size();
int l = 0;
int r = 0;
int ll = 0;
int rr = Integer.MAX_VALUE;
Map<String, Integer> map = new HashMap<>();
map.put(gems[0], 1);
while (r < gems.length && l <= r) {
if (r - l + 1 < size || map.size() < size) {
r++;
if (r < gems.length)
map.put(gems[r], map.getOrDefault(gems[r], 0) + 1);
} else {
if (r - l < rr - ll) {
rr = r;
ll = l;
}
map.put(gems[l], map.get(gems[l]) - 1);
if (map.get(gems[l]) == 0) {
map.remove(gems[l]);
}
l++;
}
}
return new int[]{ll + 1, rr + 1};
}
}
3. 정리
HashSet
을 사용해gems
배열에서 보석의 종류 개수를 구하고, 이를size
에 저장한다.
- 두 포인터
l
과r
을 초기화하고, 최소 구간을 저장할ll
과rr
을 초기화한다.
- 구간 내 보석 정보를 저장할
map
을 초기화하고, 첫 번째 보석을 추가한다.
r
이gems
의 길이보다 작고,l
이r
이하일 때 반복문을 실행한다.- 구간의 크기가
size
보다 작거나,map
의 크기가size
보다 작으면r
을 증가시키고map
에r
번째 값을 추가한다. - 그렇지 않을 경우, 저장된 최소 구간(
rr
,ll
)보다 현재 구간(r
,l
)이 더 작으면 갱신하고,map
에서l
번째 값을 감소시키고, 값이 0이 되면 제거한 뒤l
을 증가시킨다.
- 반복이 끝난 후, 최종 구간
ll
과rr
에 1을 더해 반환한다.
Share article