Strong Root

난이도 

 

문제를 보시려면 여기를 클릭

 

 

 

틀리기 쉬운 입출력 예제

입력 출력

{0}, 0

{0}, 1

{1, 1, 1}, 7

{1, 1, 1}, 8

0

-1

2

-1

 

 

 

힌트

정렬대신 TreeMap을 꼭 써야합니다.

 

매번 정렬하면 그때마다 O(N logN)이 들어가지만,

TreeMap을 이용하면 그때마다 O(logN)만 들어갑니다.

 

 

 

이하는 코드입니다.

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
50
51
52
53
54
55
56
57
58
59
60
61
62
import java.util.TreeMap;
 
public class Solution {
    public int solution(int[] scoville, int K) {
        TreeMap<Integer, Integer> scovilleCountMap = new TreeMap<>(); // 중복입력에 대응하기 위해 Set이 아닌 Map
 
        for (int num : scoville) {
            push(num, scovilleCountMap);
        }
 
        int answer = 0;
 
        while (true) {
            int min = popMin(scovilleCountMap);
 
            if (min >= K) {
                break;
            }
 
            Integer nextMin = popMin(scovilleCountMap);
 
            if (nextMin == null) {
                answer = -1;
                break;
            }
 
            int newNum = min + (nextMin * 2);
            push(newNum, scovilleCountMap);
 
            answer++;
        }
 
        return answer;
    }
 
    private Integer popMin(TreeMap<Integer, Integer> countMap) {
        if (countMap.isEmpty()) {
            return null;
        }
 
        int min = countMap.firstKey();
        int count = countMap.get(min);
 
        if (count > 1) {
            countMap.put(min, count - 1);
        } else {
            countMap.remove(min);
        }
 
        return min;
    }
 
    private void push(int num, TreeMap<Integer, Integer> countMap) {
        Integer count = countMap.get(num);
 
        if (count == null) {
            countMap.put(num, 1);
        } else {
            countMap.put(num, count + 1);
        }
    }
}
cs