문제출저 :
https://www.acmicpc.net/problem/1655
1655번: 가운데를 말해요
첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
소스코드 :
package studyGroup.may.may15;
import java.util.*;
import java.io.*;
/*
중간값 말하기
짝수라면 두 수 중에 작은 수
100,000을 매번 정렬하면 N * N * logn
시간초과가 발생한다.
최대힙과 최소힙을 이용한다.
우선순위큐
https://gh402.tistory.com/32
*/
public class 가운데를말해요1655 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
PriorityQueue<Integer> maxPQ = new PriorityQueue<>(Comparator.reverseOrder());
PriorityQueue<Integer> minPQ = new PriorityQueue<>();
for(int i = 0; i < n; i++)
{
int number = Integer.parseInt(br.readLine());
if(maxPQ.size() == minPQ.size())
{
maxPQ.add(number);
// 자리 교체
if(!minPQ.isEmpty() && maxPQ.peek() > minPQ.peek()) {
minPQ.add(maxPQ.poll());
maxPQ.add(minPQ.poll());
}
}
else {
minPQ.add(number);
// 자리 교체
if (maxPQ.peek() > minPQ.peek()) {
minPQ.add(maxPQ.poll());
maxPQ.add(minPQ.poll());
}
}
System.out.println(maxPQ.peek());
}
}
}