Algorithm/Backjoon
[ 백준 1655 JAVA ] 가운데를 말해요
youth787
2023. 9. 10. 14:42
https://www.acmicpc.net/problem/1655
1655번: 가운데를 말해요
첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
Solve
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> maxheap = new PriorityQueue<Integer>(Comparator.reverseOrder());
PriorityQueue<Integer> minheap = new PriorityQueue<Integer>();
for(int i=0; i<N; i++) {
int a = Integer.parseInt(br.readLine());
if(maxheap.size()==0) maxheap.offer(a);
else if(maxheap.size()!=0 && maxheap.size()==minheap.size()) maxheap.offer(a);
else minheap.offer(a);
if(minheap.size()!=0&& maxheap.peek()>minheap.peek()) {
maxheap.offer(minheap.poll());
minheap.offer(maxheap.poll());
}
sb.append(maxheap.peek()+"\n");
}
System.out.print(sb);
}// main end
}
주석
for(int i=0; i<N; i++) {
int a = Integer.parseInt(br.readLine());
if(maxheap.size()==0) maxheap.offer(a);
// 처음 넣는 값일 경우 maxheap부터 값을 입력한다.
else if(maxheap.size()!=0 && maxheap.size()==minheap.size()) maxheap.offer(a);
// 2번째 입력 이후부터는 두 힙의 사이즈가 같으면 maxheap에 값 입력.
else minheap.offer(a);
// 같지 않으면 minheap에 값 입력.
if(minheap.size()!=0 && maxheap.peek()>minheap.peek()) {
// 2개 이상의 입력이 생긴 후, maxheap.peek()>minheap.peek()이면 두 값 swap
maxheap.offer(minheap.poll());
minheap.offer(maxheap.poll());
}
sb.append(maxheap.peek()+"\n");
}
반응형