[백준] 1655: 가운데를 말해요 - JAVA
https://www.acmicpc.net/problem/1655
풀이
숫자를 입력할 때마다 말했던 숫자들 중 중간값을 말해야한다.
PriorityQueue 2개를 사용해 left, right로 저장하고
left의 peek이 항상 중간값이 되도록 구현했다.
따라서, left는 내림차순으로 저장 및 출력했다.
left가 비어있거나 left의 peek보다 말한 숫자가 작으면 left에 넣었다. 그렇지 않은 경우는 right에 넣는다.
left 크기와 right 크기의 차이가 1보다 크면 left에서 빼서 right에 넣어주고,
right의 크기가 더 크면 right에서 빼서 left에 넣어주었다.
즉, left의 크기와 right의 크기의 차이가 0, 1이 되도록 유지했다.
그렇게해서 left의 peek값이 항상 중간값이 되도록 했다.
메모리: 33052KB
시간: 456ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> left = new PriorityQueue<>((o1, o2) -> Integer.compare(o2, o1));
PriorityQueue<Integer> right = new PriorityQueue<>();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
if (left.isEmpty() || left.peek() >= num) {
left.add(num);
} else {
right.add(num);
}
int diff = left.size() - right.size();
if (diff == 2) {
right.add(left.poll());
} else if (diff == -1) {
left.add(right.poll());
}
sb.append(left.peek()).append("\n");
}
System.out.println(sb);
}
}