1. 문제설명
최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 구하는 문제이다.
- x가 자연수이면 배열에 x를 넣는다.
- 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);
}
}
반응형
'알고리즘 문제 > 백준' 카테고리의 다른 글
[백준] 16987번: 계란으로 계란치기 (Java) (0) | 2024.09.13 |
---|---|
[백준] 1927번: N번째 큰 수 (Java) (0) | 2024.09.11 |
[백준] 1927번: 최소 힙 (Java) (0) | 2024.09.11 |
[백준] 1504번: 특정한 최단 경로 (Java) (1) | 2024.09.10 |
[백준] 1238번: 파티 (Java) (0) | 2024.09.10 |
댓글