프로그래머스-더 맵게

1 minute read

개요

이번 문제에 대한 정리는 까페에서 커피한잔 하면서 쓰게 되었다. 역시 카페인이 함께하니 글이 좀더 잘 써지는 느낌이 든다. 다소 이야기가 옆으로 빠졌는데 본론으로 들어와 이번 문제는 힙을 이용한 문제이다. 문제 자체는 그리 어려운 문제가 아니였다.

문제 링크

분류

  • Level 2

요점

  • 최소 힙을 이용하면 쉽게 풀린다.
  • 최소 힙 특성상 모든 요소가 주어진 K를 검사할 필요 없다.
  • 최소힙을 직접 구현하지 않고 PriorityQueue(우선순위 큐)를 사용.
  • PriorityQueue가 힙을 사용하기 때문에 그 특성도 그대로 가져감

어려웠던 부분

  • 없음

코드(javascript)


public static int solution(int[] scoville, int K) {

        int answer = 0;

        java.util.PriorityQueue<Integer> scovilleHeap = new java.util.PriorityQueue<Integer>();

        for(int scovilleLevel : scoville){

            scovilleHeap.add(scovilleLevel);

        }

        while(true){

            //힙의 요소 갯수가 0이면 -1

            if(scovilleHeap.size() == 0){

                answer = -1;

                break;

            }

            int currentLevel = scovilleHeap.peek();

            //힙에서 꺼낸 첫번재 요소가 K 이상을 만족하였다면

            //나머지 요소들도 이를 만족한다고 볼 수 있다.

            //우선순위 큐가 heap을 사용하기 때문임.

            if(currentLevel >= K){

                 break;

            }

            //요소가 하나만 남았고 7이하 값이면 더이상 K 이상의 값을 만들 수 없는 상태

            if(scovilleHeap.size() == 1 && currentLevel < K){

                answer = -1;

                break;

            }

            int first = scovilleHeap.poll();

            int second = scovilleHeap.poll();

            int newScoville = first + (second * 2);

            scovilleHeap.add(newScoville);

            answer++;

        }

        return answer;

    }



  • 여기서 좀더 정리할 내용이 있다.

      peek() 함수는 큐의 내용만 확인한다.
    
      poll() 함수는 큐 내부의 요소를 제거하고 그 결과로 요소를 반환한다.
    
      최소 힙(Min Heap) : 부모 노드가 자식 노드보다 항상 작은 트리 구조를 말함.
    
      최대 힙(Max Heap) : 부모 노드가 자식 노드보다 항상 큰 트리 구조를 말함.
    

(위 문제에서는 최소 힙을 사용하여 문제를 해결하였다)

Leave a comment