IT 개발 관련/[Algorithm]

[백준] 11279번: 최대 힙

Baileyton 2024. 9. 2. 16:37
728x90

문제

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

최대 힙(Max Heap) 을 구현하여 주어진 연산을 처리하는 문제입니다. 최대 힙은 가장 큰 값을 빠르게 꺼낼 수 있는 자료구조로, 다음과 같은 연산을 지원합니다.

 

접근 방법

  • 우선순위 큐(Priority Queue) 활용:
    • 자바의 PriorityQueue는 기본적으로 최소 힙으로 작동합니다. 따라서, 최대 힙으로 사용하려면 역순 정렬을 사용하여 힙의 우선순위를 반대로 설정합니다.
  • 연산 처리:
    • x > 0일 경우: 최대 힙에 x를 추가합니다.
    • x == 0일 경우: 최대 힙에서 최댓값을 꺼내어 출력합니다. 힙이 비어있으면 0을 출력합니다.

 

풀이 과정

  • 최대 힙 구현:
    • PriorityQueue를 역순으로 정렬하여 최대 힙을 구현합니다.
  • 입력 처리 및 연산 수행:
    • 입력 값을 받아들이고, 각 값에 대해 조건에 맞는 연산을 수행합니다.
  • 결과 출력:
    • 결과를 StringBuilder에 모아두고 한 번에 출력하여 성능을 최적화합니다.

 

코드

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 br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());
        // 최대 힙을 위한 PriorityQueue 선언 (역순 정렬)
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

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

            if (x > 0) {
                // x가 자연수일 경우, 최대 힙에 추가
                maxHeap.offer(x);
            } else {
                // x가 0일 경우, 최대 힙에서 최댓값 출력
                if (maxHeap.isEmpty()) {
                    sb.append(0).append('\n');
                } else {
                    sb.append(maxHeap.poll()).append('\n');
                }
            }
        }

        // 최종 결과 출력
        System.out.print(sb);
    }
}

메모리:26492kb 시간:292ms

728x90