본문 바로가기

Algorithm/Baekjoon

[백준_JAVA_알고리즘] 11279 최대 힙 #힙 #우선순위 큐

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

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

        // 큰 숫자를 먼저 출력해야 하므로 reverseOrder()로 내림차순 정렬
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < N; i ++) {
            int x = Integer.parseInt(bufferedReader.readLine());

            // x가 0일 때, 배열이 비어있으면 0 출력
            // x가 자연수일 때, 배열 맨 앞에 추가, 출력, 제거

            if(x == 0) {
                if (priorityQueue.isEmpty())
                    stringBuilder.append(0).append("\n");
                else
                    stringBuilder.append(priorityQueue.poll()).append("\n");
            }
            else{
                priorityQueue.offer(x);
            }
        }
        System.out.println(stringBuilder);
    }
}

 

힙은 우선순위 큐 PriorityQueue를 이용해서 구현할 수 있습니다.

PriorityQueue는 기본적으로 오름차순 정렬을 하며, Collections.reverseOrder()를 통해 내림차순 정렬을 할 수 있습니다.

x가 0일 때, 배열이 비어있다면 0을 출력합니다. 비어있지 않다면, priorityQueue.poll()을 통해 가장 큰 값을 출력하고 그 값을 배열에서 제거합니다. 내림차순 정렬을 했기 때문에 priorityQueue.poll()을 하면 가장 맨 앞에 위치한 값이 가장 큰 값이며, 한 번에 출력하고 제거할 수 있습니다.

x가 자연수일 때, priorityQueue.offer(x)를 통해 배열에 x를 추가합니다.

 

.

.

.

 

문제는 아래에서 확인할 수 있습니다.

https://www.acmicpc.net/problem/11279