import java.io.*;
import java.util.*;
class Main{
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
static StringBuilder sb=new StringBuilder();
public static void main(String args[]) throws Exception {
PriorityQueue<Integer> pr_max=new PriorityQueue<>();
PriorityQueue<Integer> pr_min=new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2.compareTo(o1);
}
});
int N=Integer.parseInt(br.readLine());
for(int i=0;i<N;i++) {
int num=Integer.parseInt(br.readLine());
pr_max.add(num);
if((pr_max.size()+pr_min.size())%2!=0) {
pr_min.add(pr_max.poll());
}
else {
if(pr_min.peek()>num) {
pr_max.add(pr_min.poll());
pr_min.add(pr_max.poll());
}
}
sb.append(pr_min.peek()+"\n");
}
System.out.println(sb);
}
}
두 개의 우선순위 큐를 이용하여 한 개에는 오름차순으로, 다른 한 개에는 내림차순으로 값을 입력합니다.
오름차순으로 정렬한 우선순위 큐(pr_min)에는 중앙값보다 작은 값들을 저장하고, 내림차순으로 정렬한 우선순위 큐(pr_max)에는 중앙값보다 큰 값들을 저장합니다.
처음에 pr_max에 값을 저장합니다.
만약 pr_max와 pr_min의 개수가 홀수일 때는 pr_max에서 poll을 해 pr_min에 삽입합니다.
pr_max와 pr_min의 개수가 짝수일 때는 만약 pr_min의 최댓값이 입력값보다 크면, pr_max의 최솟값과 pr_min의 최댓값을 교환해줍니다.
여기서 pr_min의 최댓값을 중앙값으로 뽑아낼 수 있습니다.
'프로그래밍 문제 > BOJ(백준 온라인 저지)' 카테고리의 다른 글
[BOJ 11066번] 파일 합치기(JAVA) (0) | 2020.09.11 |
---|---|
[BOJ 2293번] 동전 1(JAVA) (0) | 2020.09.10 |
[BOJ 11279번] 최대 힙(JAVA) (0) | 2020.09.08 |
[BOJ 1927번] 최소 힙 (JAVA) (0) | 2020.09.07 |
[BOJ 1300번] K번째 수(JAVA) (0) | 2020.09.04 |