수를 하나씩 입력받을 때마다 중앙값을 출력하는 문제입니다.
최대 힙과 최소 힙 두 개를 유지하면서 중앙값을 관리합니다.
maxHeap | minHeap
--------|--------
3 2 | 5 7
↑
중앙값은 항상 maxHeap의 top
maxHeap.peek()if (maxHeap.size() == minHeap.size()) {
maxHeap.add(num);
} else {
minHeap.add(num);
}
if (maxHeap.peek() > minHeap.peek()) {
maxHeap.add(minHeap.poll());
minHeap.add(maxHeap.poll());
}
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (maxHeap.size() == minHeap.size()) {
maxHeap.add(num);
} else {
minHeap.add(num);
}
if (!maxHeap.isEmpty() && !minHeap.isEmpty() && maxHeap.peek() > minHeap.peek()) {
maxHeap.add(minHeap.poll());
minHeap.add(maxHeap.poll());
}
sb.append(maxHeap.peek()).append("\n");
}
O(N×logN)O(N)package B1655;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
public class Main {
static int N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (maxHeap.size() == minHeap.size()) {
maxHeap.add(num);
} else {
minHeap.add(num);
}
if (!maxHeap.isEmpty() && !minHeap.isEmpty() && maxHeap.peek() > minHeap.peek()) {
maxHeap.add(minHeap.poll());
minHeap.add(maxHeap.poll());
}
sb.append(maxHeap.peek()).append("\n");
}
System.out.print(sb);
}
}