๊ฐœ์ธ๊ณต๋ถ€/Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ํž™(Heap) ๋” ๋งต๊ฒŒ _ ์ž๋ฐ”Java

young_9 2020. 7. 15. 03:21

๋‚œ์ด๋„: Level 2

 1. ๋ฌธ์ œ  

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

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ๋” ๋งต๊ฒŒ

๋งค์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Leo๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋‘ ๊ฐœ์˜ ์Œ์‹์„ ์•„๋ž˜์™€ ๊ฐ™๏ฟฝ๏ฟฝ

programmers.co.kr

| ๋ฌธ์ œ ์„ค๋ช…

๋งค์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Leo๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ๋‘ ๊ฐœ์˜ ์Œ์‹์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ž์–ด ์ƒˆ๋กœ์šด ์Œ์‹์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

์„ž์€ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ = ๊ฐ€์žฅ ๋งต์ง€ ์•Š์€ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ + (๋‘ ๋ฒˆ์งธ๋กœ ๋งต์ง€ ์•Š์€ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ * 2)

 

Leo๋Š” ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ K ์ด์ƒ์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜์—ฌ ์„ž์Šต๋‹ˆ๋‹ค.
Leo๊ฐ€ ๊ฐ€์ง„ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ ๋‹ด์€ ๋ฐฐ์—ด scoville๊ณผ ์›ํ•˜๋Š” ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ K๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์„ž์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œ ํšŸ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

| ์ œํ•œ ์‚ฌํ•ญ

  • scoville์˜ ๊ธธ์ด๋Š” 2 ์ด์ƒ 1,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • K๋Š” 0 ์ด์ƒ 1,000,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • scoville์˜ ์›์†Œ๋Š” ๊ฐ๊ฐ 0 ์ด์ƒ 1,000,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ K ์ด์ƒ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ return ํ•ฉ๋‹ˆ๋‹ค.

| ์ž…์ถœ๋ ฅ ์˜ˆ

 scoville  K  return
 [1, 2, 3, 9, 10, 12]  7  2

 

| ์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

  1. ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ 1์ธ ์Œ์‹๊ณผ 2์ธ ์Œ์‹์„ ์„ž์œผ๋ฉด ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
    ์ƒˆ๋กœ์šด ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ = 1 + (2 * 2) = 5
    ๊ฐ€์ง„ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ = [5, 3, 9, 10, 12]

  2. ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ 3์ธ ์Œ์‹๊ณผ 5์ธ ์Œ์‹์„ ์„ž์œผ๋ฉด ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
    ์ƒˆ๋กœ์šด ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ = 3 + (5 * 2) = 13
    ๊ฐ€์ง„ ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜ = [13, 9, 10, 12]

๋ชจ๋“  ์Œ์‹์˜ ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ 7 ์ด์ƒ์ด ๋˜์—ˆ๊ณ  ์ด๋•Œ ์„ž์€ ํšŸ์ˆ˜๋Š” 2ํšŒ์ž…๋‹ˆ๋‹ค.

 


 2. ์•Œ๊ณ ๋ฆฌ์ฆ˜ by Yoon 

1. ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๋ฅผ PriorityQueue์— ๋„ฃ๋Š”๋‹ค. (default: min Heap)

2. PriorityQueue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ while๋ฌธ์„ ๋ˆ๋‹ค.

     2.1 PriorityQueue์—์„œ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์ €์žฅํ•œ๋‹ค.

          2.1.1 ๋งŒ์•ฝ ์ตœ์†Œ๊ฐ’์ด K๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฐ ๊ฒฝ์šฐ๋Š” ๋ฐ”๋กœ answer๋ฅผ returnํ•œ๋‹ค.

          2.1.2 K๋ณด๋‹ค๋Š” ์ž‘์œผ๋‚˜ PriorityQueue์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐœ๋ฅผ ํ•ฉ์น  ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— -1์„ return ํ•œ๋‹ค.

(2.1์—์„œ ์•ž์—์„œ ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์„ž์œผ๋ฉด ๋œ๋‹ค!) 

     2.2 ์Šค์ฝ”๋นŒ ์ง€์ˆ˜๊ฐ€ ์ œ์ผ ์ž‘์€ ๋‘ ๊ฐœ๋ฅผ ๋ฝ‘์•„ ๊ณต์‹๋Œ€๋กœ ์„ž์–ด ๋‹ค์‹œ ๋„ฃ๋Š”๋‹ค.

     2.3 answer๋ฅผ ํ•˜๋‚˜ ์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.

 

 

 


 3. ์†Œ์Šค์ฝ”๋“œ 

import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        int answer = 0;
        int min = 0;
        
        PriorityQueue<Integer> scovilleList = new PriorityQueue<Integer>();
        for(int i = 0; i < scoville.length; i++){
            scovilleList.offer(scoville[i]);
        }
        
        while (!scovilleList.isEmpty()) {
            min = scovilleList.peek();
            if(min >= K) return answer;
            else if(scovilleList.size() == 1) return -1;
            
            int num1 = scovilleList.poll();
            int num2 = scovilleList.poll();
            int num = num1 + num2 * 2;
            
            scovilleList.offer(num);
            answer++;
            
        }
        
        return -1;
    }
}

 

 4. ๋А๋‚€์  

๋‚ด๊ฐ€ ์ง  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ์ค€์œผ๋กœ ์˜ˆ์™ธ ์ผ€์ด์Šค๋“ค์ด ๋งŽ์•„์„œ ์• ๋ฅผ ๋จน์—ˆ๋‹ค.. ๐Ÿ˜ฅ

 

 

 

[Algo Rhythm๐Ÿ•บ๐Ÿ’ƒ]

๋‚ ์งœ: 2020.07.13