1. 문제
https://www.acmicpc.net/problem/1655
2. 접근방법
불러준 숫자의 가운데 숫자를 찾아야 한다.
우선순위큐 2개를 이용해서 가운데 숫자보다 작은 숫자들과 큰 숫자들을 각각 관리해주면 된다.
살짝 웹페이지 뒤로가기 기능과 비슷한 느낌
1234 5 6789
작은 수들에서는 max heap
큰 수들에서는 min heap으로 관리하여
min heap 과 max heap의 크기를 조건에 맞게 유지하면서 가운데 값을 구하면 된다.
tip) 출력이 10만건 일어나기 때문에 StringBuilder에 담아서 한번에 출력하자
3. 자바 코드
package backjoon;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
public class P1655가운데를말해요 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Integer> left = new PriorityQueue<>((o1, o2) -> o2 - o1);
PriorityQueue<Integer> right = new PriorityQueue<>();
StringBuilder answer = new StringBuilder();
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine());
int mid = left.peek() == null ? 0 : left.peek();
if(num < mid) left.add(num);
else right.add(num);
if (left.size() > right.size() + 1) right.add(left.poll());
else if(left.size() < right.size()) left.add(right.poll());
answer.append(left.peek()).append("\n");
}
System.out.println(answer);
}
}
4. 마치며
아이디어가 재밌는 문제
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준] 9935 문자열 폭발 (0) | 2022.11.20 |
---|---|
[백준] 23817 포항항 (0) | 2022.11.17 |
[백준] 1036 36진수 (0) | 2022.11.03 |
[백준] 4195 친구 네트워크 (0) | 2022.10.25 |
[백준] 1043 거짓말 (1) | 2022.10.14 |