Publish:

νƒœκ·Έ: , , , , ,

μΉ΄ν…Œκ³ λ¦¬:

img_3.png

문제

문제 링크

img_3.png

풀이

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
class Solution {
    public int solution(int[] scoville, int K) {
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        for (int j : scoville) {
            minHeap.add(j);
        }

        return getInteger(minHeap, K);

    }

    private Integer getInteger(PriorityQueue<Integer> minHeap, int K) {
        int count = 0;

        while (minHeap.peek() < K) {
            // 1
            if (minHeap.size() <= 1) {
                count = -1;
                break;
            }
            Integer firstMin = minHeap.poll();
            Integer secondMin = minHeap.poll();
            int newScoville = firstMin + (secondMin * 2);
            // 2
            minHeap.add(newScoville);
            count++;

        }
        return count;

    }
}

λ¬Έμ œμ—μ„œ μž‘μ€ μš”μ†Œλ₯Ό κ³„μ†ν•΄μ„œ 뽑아내 κ³„μ‚°ν•˜λŠ” 쑰건이 μžˆκΈ°λ•Œλ¬Έμ— μš°μ„ μˆœμœ„ 큐(Heap) 을 μ‚¬μš©ν•˜κΈ°μ— μ’‹μ•„ 보인닀. 초기 μž…λ ₯ 배열을 λͺ¨λ‘ Heap 에 λ„£μœΌλ©΄ 이후 poll() 둜 κΊΌλ‚Όλ•Œλ§ˆλ‹€ μ΅œμ†Œκ°’μ΄ 꺼내지기 λ•Œλ¬Έμ— νŽΈλ¦¬ν•˜λ‹€. (λ§Œμ•½ μ΅œμ†Œνž™μ΄ μ•„λ‹ˆλΌ μ΅œλŒ€νž™μ΄ ν•„μš”ν•˜λ‹€λ©΄ new PriorityQueue<>(Comparator.reverseOrder()) 이런 μ‹μœΌλ‘œ Comparator νƒ€μž…μ˜ μ •λ ¬ 쑰건을 λ‘λ²ˆμ§Έ 인자둜 λ„£μ–΄μ£Όλ©΄ λœλ‹€.)

λ¨Όμ € μŠ€μ½”λΉŒ μ§€μˆ˜λ₯Ό μž¬κ³„μ‚° ν•΄μ„œ λ‹€μ‹œ νž™μœΌλ‘œ κ³„μ†ν•΄μ„œ λ„£μ–΄μ£ΌλŠ” μž‘μ—…μ΄ ν•„μš”ν•˜λ‹€. 2번 μ£Όμ„μ—μ„œ κ·Έ 역할을 ν•˜κ³  μžˆλ‹€. κ·Έ ν›„ μž‘μ—… 횟수λ₯Ό 1 μ¦κ°€μ‹œμΌœ μ€€ λ’€ λ‹€μ‹œ while λ¬Έ 쑰건을 ν™•μΈν•˜κ²Œ λœλ‹€. μ΅œμ†Œνž™μ—μ„œ minHeap.peek() 은 항상 μ΅œμ†Œκ°’μ„ λ°˜ν™˜ν•˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” λͺ¨λ“  ν•­λͺ©μ΄ K 보닀 컀야 λœλ‹€ λŠ” 것은 μ΅œμ†Œκ°’μ΄ K 보닀 크닀면 λ‚˜λ¨Έμ§€ ν•­λͺ©μ€ λ³Ό ν•„μš” μ—†κ²Œλœλ‹€.

단지 νž™μ—μ„œ κΊΌλ‚Έ κ·Έ κ°’λ§Œ 가지고 쑰건을 λ§Œλ“€ 수 μžˆμ–΄ μ½”λ“œκ°€ κ°„κ²°ν•΄ 진닀.

λ§Œμ•½ μš°μ„ μˆœμœ„ 큐가 μ•„λ‹Œ ArrayList λ‚˜ λ°°μ—΄λ‘œ ν’€κ²Œλ˜λ©΄ μ •λ ¬ ν•˜λŠ” μž‘μ—…μ„ μΆ”κ°€λ‘œ ν•΄μ•Όλœλ‹€.

while 문을 μΆ©λΆ„νžˆ λŒκ³ λ‚˜λ©΄ νž™μ˜ ν•­λͺ©μ΄ 계속 쀄어듀어 κ²°κ΅­ μ € 계산식을 μˆ˜ν–‰ν•  만큼의 ν•­λͺ©λ„ 남지 μ•Šκ²Œ 될 것이닀. κ·Έ 쑰건이 1번 주석에 ν•΄λ‹Ήν•œλ‹€. νž™μ˜ ν•­λͺ©μ΄ 1개 μ΄ν•˜λ‘œ λ–¨μ–΄μ§€κ²Œ 되면 더이상 newScoville 값을 λ§Œλ“€ 수 μ—†κΈ° λ•Œλ¬Έμ— λ¬Έμ œμ—μ„œ μš”κ΅¬ν•˜λŠ” -1 을 λ¦¬ν„΄ν•΄μ€˜μ•Ό ν•œλ‹€.

λ°©λ¬Έν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! λŒ“κΈ€,지적,ν”Όλ“œλ°± μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€πŸ˜Š

λŒ“κΈ€λ‚¨κΈ°κΈ°