λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€[Java] - (Level2)더 맡게(Heap)

by 주발2 2020. 3. 20.
λ°˜μ‘ν˜•

https://programmers.co.kr/learn/courses/30/lessons/42626

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

μ½”λ“œ

import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        Queue<Integer> pq = new PriorityQueue<Integer>();
        // μš°μ„ μˆœμœ„ 큐에 λ°°μ—΄κ°’ μ €μž₯
        for(int i : scoville)   pq.offer(i);
        
        // μš°μ„ μˆœμœ„ 큐에 μŠ€μ½”λΉŒμ§€μˆ˜ K보닀 값이 μž‘μ„λ•Œ 반볡
        while(pq.peek() < K){
            // ν˜„μž¬ μš°μ„ μˆœμœ„ 큐에 값이 ν•œκ°œλ§Œ μ‘΄μž¬ν•˜κ³ , 그값이 K보닀 μž‘μœΌλ―€λ‘œ μŠ€μ½”λΉŒμ§€μˆ˜λ₯Ό λ§Œλ“€ 수 μ—†μŒ -> -1 리턴
            if(pq.size() == 1)
                return -1;
            
            // μ„žμ€ μŒμ‹μ˜ μŠ€μ½”λΉŒ μ§€μˆ˜ = κ°€μž₯ 맡지 μ•Šμ€ μŒμ‹μ˜ μŠ€μ½”λΉŒ μ§€μˆ˜ + (두 번째둜 맡지 μ•Šμ€ μŒμ‹μ˜ μŠ€μ½”λΉŒ μ§€μˆ˜ * 2)
            int a = pq.poll();
            int b = pq.poll();
            pq.offer(a+(2*b));
            answer ++;
        }
        
        return answer;
    }
}

풀이

μš°μ„ μˆœμœ„νλ₯Ό μ‚¬μš©ν•˜λŠ” 문제둜, νž™ μžλ£Œκ΅¬μ‘°μ— λŒ€ν•œ κ°œλ…μ΄ λΆ€μ‘±ν•˜κ³ ,, μš°μ„ μˆœμœ„νλŠ” 사싀 거의 처음 μ‚¬μš©ν•΄ λ³΄λŠ” 것 κ°™λ‹€. λ‹€μŒμ— μ‹œκ°„λ‚ λ•Œ νž™μ—λŒ€ν•΄ 정리λ₯Ό ν•΄μ•Όκ² λ‹€.

 

μš°μ„ μˆœμœ„ νλŠ” 큐의 μΌμ’…μ΄μ§€λ§Œ, νμ™€λŠ” λ‹€λ₯΄κ²Œ 기쑴의 μ„ μž…μ„ μΆœμ΄ μ•„λ‹Œ μš°μ„ μˆœμœ„κ°€ 높은 μˆœμ„œλŒ€λ‘œ λ°˜ν™˜ν•œλ‹€.

즉 μœ„ μš°μ„ μˆœμœ„ pq에 μ–΄λ– ν•œ 값이 μžˆλ“  μš°μ„ μˆœμœ„κ°€ κ°€μž₯ 높은(κ°€μž₯ μž‘μ€κ°’) 값이 peek()에 μ˜ν•΄ K와 비ꡐ가 λœλ‹€.

K보닀 μž‘μ„λ•Œ, κ°€μž₯ μž‘μ€ κ°’ 두 개λ₯Ό λΉΌλ‚΄κ³  이 두 개의 값을 톡해 μƒˆλ‘œμš΄ κ°’(μŠ€μ½”λΉŒμ§€μˆ˜)을 λ§Œλ“ λ‹€.

 

즉 데이터듀이 μš°μ„  μˆœμœ„μ—λ”°λΌ μžλ™μœΌλ‘œ μ •λ ¬λ˜λŠ” νŽΈλ¦¬ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€ !

 

λ°˜μ‘ν˜•

λŒ“κΈ€