본문 바로가기

Programmers/Level3

[카카오 인턴] 보석 쇼핑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.*;
class Solution {
    public int[] solution(String[] gems) {
        int[] answer = new int[2];
        HashSet<String> set = new HashSet<String>();
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        HashSet<String> collectedList = new HashSet<String>();
 
        // 보석 목록 저장
        for (int i = 0; i < gems.length; i++) {
            set.add(gems[i]);
        }
        // 보석 카운트 초기화
        for (String s : set)
            map.put(s, 0);
 
        int start = 0, end = 0;
        int left = 0, right = gems.length - 1;
        boolean flag = false;
        while (start < gems.length && end < gems.length) {
            // 수집되지 않은 상태
            if (!flag) {
                map.put(gems[end], map.get(gems[end]) + 1); // 현재 항목 추가
                collectedList.add(gems[end]);
            } else { // 수집된 상태
                map.put(gems[start - 1], map.get(gems[start - 1]) - 1); // 이전 항목 제거
                if (map.get(gems[start - 1]) == 0)
                    collectedList.remove(gems[start - 1]);
            }
 
            // 다 수집되었는지 확인
            if (collectedList.size() == set.size()) {
                flag = true;
                // 최소 구간 저장
                if (right - left > end - start) {
                    left = start;
                    right = end;
                }
                start++;
            } else {
                flag = false;
                end++;
            }
        }
        answer[0= left + 1;
        answer[1= right + 1;
        return answer;
    }
}
cs

모든 보석을 수집하는 가장 최소 길이의 구간을 구하는 문제이다.

이중 for문을 사용하면 쉽게 해결할 수 있지만, 효율성의 문제로 인해 슬라이딩 윈도우 기법을 이용하였다.

해당 알고리즘은 이전에 계산했던 구간에 대한 처리를 제외하는 것으로 시간을 매우 절약할 수 있다.

 

보석이 수집되었는지 판단하는 것으로 매번 map의 모든 value를 검사했었는데, 이 때문에 시간 초과가 났다.

수집된 리스트를 Set으로 저장하고 해당 Set의 길이만 비교하는 것으로 해결하였다.

 

참고 사이트 1 : https://blog.fakecoding.com/archives/algorithm-slidingwindow/ 

참고 사이트 2 : https://m.blog.naver.com/kks227/220795165570

 

 

 

'Programmers > Level3' 카테고리의 다른 글

등굣길  (0) 2021.08.24
하노이의 탑  (0) 2021.08.18
모두 0으로 만들기  (0) 2021.08.17
여행경로  (0) 2021.08.17
디스크 컨트롤러  (0) 2021.08.16