ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 : 더 맵게
    Solve Algorithms/Array, Heap, Stack, Queue 2020. 6. 15. 18:55
    728x90

    출처 : programmers.co.kr/learn/courses/30/parts/12117

     

    알고리즘 분류 : 힙


    문제 설명

    매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다.

    모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다.

    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인 음식과 2인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.

     

    두 번째 시도 : 스코빌 지수가 3인 음식과 5인 음식을 섞으면 음식의 스코빌 지수가 아래와 같이 됩니다.

     

    결과 : 모든 음식의 스코빌 지수가 7 이상이 되었고 이때 섞은 횟수는 2회입니다.


    접근

    • 새로운 지수를 만드는데에 필요한 수는 배열에서 가장 작은 수와 그 다음으로 작은 수이다. 
    • 따라서 배열을 항상 오름차순으로 정렬한다면, 접근하기 편리할 것이다. 
    • 이와 같은 이유로, PriortyQueue를 이용하였다. 
    • PriorityQueue를 이용하는 것과, Heap Class와 push(), pop() 함수를 구현하는 것 중, 무엇이 더 효율적인지를 생각해봐야겠다. 

    코드

     

    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
    package programmers;
     
    import java.util.*;
     
    public class Heap_1 {
        public int solution(int[] scoville, int K) {
            int answer = 0;
            PriorityQueue<Integer> q = new PriorityQueue<Integer>();
     
            for (int i : scoville) {
                q.add(i);
            }
     
            int tmp = 0;
            while (true) {
                q.add(q.poll() + 2 * q.poll());
                tmp = q.peek();
                if (q.size() == 1 && tmp < K) {
                    answer = -1;
                    break;
                } else {
                    if (tmp >= K) {
                        answer++;
                        break;
                    } else {
                        answer++;
                    }
                }
            }
            
            return answer;
        }
    }
     
     
     
    cs
    728x90

    댓글

kxmjhwn@gmail.com