문제
문제 풀이
✔️ 알고리즘
1. Set 자료구조를 이용하여 보석의 종류 개수를 구함.
2. gems배열을 편하게 카운팅 하기 위하여 HashMap으로 보석이름과 인덱스를 매칭해줌
3. gems배열을 순회하면서 모든 종류의 보석을 담았을 경우 인덱스 갱신해줌
- sidx, eidx 둘 다 처음으로 지정한 후 모든 보석의 종류를 담을 때까지 eidx를 증가한다.
- 이 때, 증가하면서 나온 보석들을 종류별로 카운팅해주는데 sidx를 다음 값으로 옮겼을 때, 같은 보석일 경우 바로 갱신을 해주고, 다른 보석일 경우에도 eidx의 보석값에 따라 바로 바로 값갱신이 가능해지기 때문
소스 코드
class Solution {
public int[] solution(String[] gems) {
int[] answer = new int[2];
int idx = 1;
HashMap<String, Integer> map = new HashMap<>();
Set<String> set = new HashSet<>();
for(String s: gems)
set.add(s);
for(String s: set)
map.put(s, idx++);
int num = set.size(); //보석 개수
int min_idx = 0, max_idx = 0;
int sidx = 0, eidx = 0;
int[] count = new int[num+1];
int cnt = 0, differ = Integer.MAX_VALUE;
while(eidx < gems.length){
if(count[map.get(gems[eidx])] == 0)
cnt++;
count[map.get(gems[eidx])]++;
eidx++;
while(cnt == num){
if(differ > eidx - sidx){
differ = eidx - sidx;
max_idx = eidx;
min_idx = sidx;
}
count[map.get(gems[sidx])]--;
if(count[map.get(gems[sidx])] == 0)
cnt--;
sidx++;
}
}
answer[0] = min_idx + 1;
answer[1] = max_idx;
return answer;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[PCCP모의고사2] 1번 실습용 로봇 JAVA (1) | 2024.02.17 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 자바 (1) | 2022.10.05 |
[프로그래머스] 자물쇠와 열쇠 자바 (0) | 2022.03.08 |
[프로그래머스] 단체사진 찍기 자바 (0) | 2022.01.21 |
[프로그래머스] 등굣길 자바 (0) | 2022.01.11 |