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);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 11066: 파일 합치기 - JAVA (0) | 2024.05.14 |
---|---|
[백준] 11049: 행렬 곱셈 순서 - JAVA (0) | 2024.05.14 |
[백준] 2410: 2의 멱수의 합 - JAVA (0) | 2024.05.13 |
[백준] 15681: 트리와 쿼리 - JAVA (0) | 2024.05.13 |
[백준] 2146: 다리 만들기 - JAVA (0) | 2024.05.13 |
[백준] 1005: ACM Craft - JAVA (0) | 2024.05.13 |