https://www.acmicpc.net/problem/1655
입력한 값의 작은 값을 담는 공간하나 큰 값을 담는 공간하나
데이터 수를 일정하게 유지시키며 작은 값을 추출!
-> 왜 더 작은 값 추출?
짝수개이면 가운데 둘중에 작은 수를 추출하기 때문
import java.io.*;
import java.util.*;
public class Main {
static int N;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for(int i = 0 ; i < N; i++){
int num = Integer.parseInt(br.readLine());
if(minHeap.size() == maxHeap.size()) {
maxHeap.offer(num); // 사이즈가 같으면 max에 넣음 => 무조건 max의 peek를 꺼내서 출력하기 위함
} else{
minHeap.offer(num); // 사이즈가 다르면 min에 넣음 => max와 min의 크기를 맞추기 위해 , 항상 max가 크거나 같음
}
if(!minHeap.isEmpty() && !maxHeap.isEmpty())
if(minHeap.peek() < maxHeap.peek()){ // max의 peek가 더 작아야 max에서만 조건에 맞는 값 추출가능
int tmp = minHeap.poll();
minHeap.offer(maxHeap.poll());
maxHeap.offer(tmp);
}
sb.append(maxHeap.peek() + "\n"); // 처리 이후 출력에 담음
}
System.out.println(sb);
}
}
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); // 큰 수 우선순위 큐
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (maxHeap.size() == minHeap.size()) {
maxHeap.offer(num);
} else {
minHeap.offer(num);
}
// maxHeap의 루트가 minHeap의 루트보다 크다면 두 루트를 교환
if (!maxHeap.isEmpty() && !minHeap.isEmpty() && maxHeap.peek() > minHeap.peek()) {
int maxRoot = maxHeap.poll();
int minRoot = minHeap.poll();
maxHeap.offer(minRoot);
minHeap.offer(maxRoot);
}
sb.append(maxHeap.peek()).append("\n");
}
for(int i = 0; i < N; i++){
int num = Integer.parseInt(br.readLine());
maxHeap.offer(num);
// maxHeap의 최대값을 minHeap으로 이동
if (!maxHeap.isEmpty()) {
minHeap.offer(maxHeap.poll());
}
// maxHeap의 크기와 minHeap의 크기를 맞추기
if (maxHeap.size() < minHeap.size()) {
maxHeap.offer(minHeap.poll());
}
sb.append(maxHeap.peek()).append("\n");
}
👉 2번째 방식이 더욱 간결하고 peek를 교환하는 오버헤드가 없을 것 같다!
import java.io.*;
import java.util.*;
public class Main {
static int N;
static StringBuilder sb = new StringBuilder();
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<>(); // 작은 수 우선순위 큐
for(int i = 0; i < N; i++){
int num = Integer.parseInt(br.readLine());
maxHeap.offer(num);
// maxHeap의 최대값을 minHeap으로 이동
if (!maxHeap.isEmpty()) {
minHeap.offer(maxHeap.poll());
}
// maxHeap의 크기와 minHeap의 크기를 맞추기
if (maxHeap.size() < minHeap.size()) {
maxHeap.offer(minHeap.poll());
}
sb.append(maxHeap.peek()).append("\n");
}
System.out.print(sb);
}
}
-> minHeap은 maxHeap의 최댓값으로 채워지게 됨