백준 11286
백준 11286 문제
import java.util.*;
public class Boj11286 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
PriorityQueue<Integer> queue = new PriorityQueue<>((n1, n2) -> {
int firstAbs = Math.abs(n1);
int secondAbs = Math.abs(n2);
if (firstAbs == secondAbs) {
return n1 > n2 ? 1 : -1;
}
return firstAbs - secondAbs;
});
for (int i = 0; i < n; i++) {
int request = sc.nextInt();
if (request == 0) {
if (queue.isEmpty()) {
System.out.println(0);
} else {
System.out.println(queue.poll());
}
} else {
queue.add(request);
}
}
}
}
풀이
- 해당 문제는 우선순위 큐의 비교자를 수정하여 조건에 맞는 우선순위 큐를 구현할 수 있으면 해결할 수 있는 문제이다.
Scanner를 통해 연산 횟수 n를 받는다.
- 우선순위 큐를 생성하는데 매개변수로
Comparator 람다를 전달한다.
Comparator는 입력 받은 두 수의 절대값을 구하고, 만약 두 절대값이 같다면, 원래의 두 수를 비교하여, 첫 번째 수가 크면 1를 두 번째 수가 크면 -1 반환한다.
- 두 절대값 수가 다르다면,
firstAbs - secondAbs를 하여 첫 번째 수가 크면 양수를 두 번째 수가 크면 음수를 반환하게 한다.
- 이제
n만큼 반복을 하면서 입력된 수를 받아 request에 넣어준다.
request가 0이면 우선순위 큐가 비어있는지 확인하고, 비어 있으면 0을 출력한다.
- 우선순위 큐가 비어있지 않다면,
poll()를 통해 정렬된 가장 앞의 수를 출력한다.
request가 0이 아니면 입력된 수를 우선순위 큐에 넣는다.