✔️ 2중 for문

import java.util.*;
class Solution {
public int[] solution(String[] gems) {
Set<String> set = new HashSet<>();
for(String gem : gems){
set.add(gem);
}
int[] answer = new int[2];
int result = Integer.MAX_VALUE;
for(int i = 0; i<gems.length; i++){
Set<String> s = new HashSet<>();
for(int j = i; j<gems.length; j++){
s.add(gems[j]);
if(set.size() == s.size()) {
if (result > j - i) {
result = j - i;
answer[0] = i + 1;
answer[1] = j + 1;
}
break;
}
}
}
return answer;
}
}
✔️ 투포인터 + HashSet

import java.util.*;
class Solution {
public int[] solution(String[] gems) {
Set<String> set = new HashSet<>(Arrays.asList(gems));
int targetCnt = set.size();
int left = 0, right = 0;
int[] answer = new int[2];
int cnt = Integer.MAX_VALUE;
while(left <= right && right < gems.length){
Set<String> check = new HashSet<>();
for(int i = left; i<=right; i++){
check.add(gems[i]);
}
if (check.size() < targetCnt) right++;
else if (check.size() == targetCnt) {
if(cnt > right - left){
answer[0] = left+1;
answer[1] = right+1;
cnt = right - left;
}
left++;
}
}
return answer;
}
}
✔️ 투포인터 + HashMap
import java.util.*;
class Solution {
public int[] solution(String[] gems) {
Set<String> set = new HashSet<>(Arrays.asList(gems));
int types = set.size();
int left = 0, right = 0;
int[] answer = new int[2];
int minLen = Integer.MAX_VALUE;
HashMap<String, Integer> gem = new HashMap<>();
while(right < gems.length){
// 보석 추가
gem.put(gems[right], gem.getOrDefault(gems[right], 0) + 1);
right++;
// gem 해시맵에 보석이 다 들어온 경우
while (gem.size() == types) {
// 보석 중 짧은 구간 찾기
if (minLen > right - left){
answer[0] = left+1;
answer[1] = right;
minLen = right - left;
}
// left 위치 늘리고 기존 left는 gem 해시맵에서 제거
gem.put(gems[left], gem.get(gems[left]) - 1);
if (gem.get(gems[left]) == 0){
gem.remove(gems[left]);
}
left++;
}
}
return answer;
}
}