본문 바로가기
알고리즘 문제/백준

[백준] 11279번: 최대 힙 (Java)

by Lpromotion 2024. 9. 11.

1. 문제설명

최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 구하는 문제이다.

  1. x가 자연수이면 배열에 x를 넣는다.
  2. x가 0이면 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.

프로그램은 처음에 비어있는 배열에서 시작하게 된다.

  • 시간 제한: 1초 (Java 11: 2초)
  • 메모리 제한: 256MB

 

2. 접근 방식

  • 우선순위 큐를 사용하여 최대 힙을 구현한다.
  • 최대 힙이기 때문에 우선순위 큐는 내림차순 정렬되도록 설정한다. (참고)
  • 연산
    • x가 자연수 ⇒ 값 추가
    • x가 0 ⇒ 가장 큰 값 출력 & 제거 ⇒ 큐의 맨 첫 번째 값 출력 & 제거
      • 만약 큐가 비어있으면 0을 출력

 

3. 최종 코드

import java.io.*;
import java.util.*;

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<>(Collections.reverseOrder());
        StringBuilder sb = new StringBuilder();
        
        for(int i=0; i<n; i++) {
            int x = Integer.parseInt(br.readLine());
            if(x==0) { // x가 0이면
                // 큐가 비었을 경우 0을 출력
                if(pq.isEmpty()) sb.append("0\\n");
                    // 아닌 경우 가장 큰 값 출력 & 제거
                else sb.append(pq.poll()+"\\n");
            } else { // x가 자연수이면
                pq.offer(x); // x를 큐에 추가
            }
        }

        System.out.println(sb);
    }
}
반응형

댓글