[BaekJoon] #11279 최대힙

현굥·2024년 8월 12일

BaekJoon

목록 보기
9/53

  • 자바에서는 현재 Priority Queue를 이용해서 최대힙, 최소힙을 간단하게 사용할 수 있도록 제공해주고 있습니다.

  • 문제를 이해해봅시다. 첫째줄에 연산의 갯수 N을 입력받습니다.
    그 다음엔, N번 정수X를 입력받는데, X가 자연수면 배열에 X를 추가하고, X가 0이면, 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거해야합니다.

  • 정수를 입력받기 위해, BufferedReader를 사용했습니다.

  • BufferedReader는 문자열로 받아오기 때문에, Integer.parseInt()를 사용해서, 정수형으로 바꾸어줍니다.

  • 우선순위큐를 선언해주고, 기본은 우선순위가 낮은 숫자가 부여되기 때문에, 메서드를 활용하여 높은 숫자가 우선순위가 되도록 오름차순으로 정렬합니다.

  • 그 후, 값을 출력하기 위한 StringBuilder 를 선언해주었습니다.

  • for문을 통해 N번 반복해가며, x를 입력받고, 조건문을 나눠 각 x값에 따른 조건별로 값을 sb에 추가해주거나, x를 pq에 넣어주었습니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Collections;
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) throws IOException  {
         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
         int n = Integer.parseInt(br.readLine());

         PriorityQueue<Integer> pq = new PriorityQueue<Integer>(Collections.reverseOrder());
         StringBuilder sb = new StringBuilder();

         for(int i=0; i<n; i++){
             int x = Integer.parseInt(br.readLine());
             if( x == 0 ){
                 if(pq.isEmpty()) sb.append("0").append("\n"); // pq가 비어있다면, sb에 0추가
                 else{ sb.append(pq.poll()).append("\n"); // pq에서 최댓값을 추출해 sb에 추가
                 }
             }else{
                 pq.offer(x); // 입력값이 자연수라면, 배열에 x를 추가 
             }

        }
        System.out.println(sb); // x가 0인 경우에만 추가하였으므로, 0이 주어진 횟수만큼 답을 출력하게 됨 
    }

}

0개의 댓글