import java.util.*;
class Solution {
public int[] solution(String[] operations) {
PriorityQueue<Number> max = new PriorityQueue<>((o1,o2)->o2.value-o1.value);
PriorityQueue<Number> min = new PriorityQueue<>((o1,o2)->o1.value-o2.value);
for(String operation : operations){
String[] split = operation.split(" ");
if(split[0].equals("I")){
Number num = new Number(Integer.parseInt(split[1]));
max.add(num);
min.add(num);
}else if(split[1].equals("1")){
//최댓값 제거
while(!max.isEmpty()){
Number num = max.poll();
if(num.isDeleted) continue;
num.isDeleted = true;
break;
}
}else{
//최소값 제거
while(!min.isEmpty()){
Number num = min.poll();
if(num.isDeleted) continue;
num.isDeleted = true;
break;
}
}
}
//전처리
Deque<Number> tempQ = new ArrayDeque<>();
//Queue<Number> tempQ = new ArrayDeque<>();
int size = max.size();
// for(int i=0 ; i<max.size() ; i++){
//아오;;; 변하는수를 저기에 넣었네;;;
for(int i=0 ; i<size ; i++){
if(max.isEmpty()) break;
if(max.peek().isDeleted) {
max.poll();
}
else{
tempQ.add(max.poll());
}
}
// max 333 45 -45 -642(-)
// min -45 45 333 97(-) 653(-)
if(tempQ.isEmpty()){
return new int[]{0,0};
}
int[] answer = new int[2];
//System.out.println(tempQ.size());
answer[0] = tempQ.peekFirst().value;
answer[1] = tempQ.peekLast().value;
return answer;
}
class Number{
public int value;
public boolean isDeleted = false;
Number(int value){
this.value = value;
}
}
}
import java.util.PriorityQueue;
public class Solution {
private static class DoublyPriorityQueue {
private int size = 0;
private final PriorityQueue<Integer> minPq
= new PriorityQueue<>();
private final PriorityQueue<Integer> maxPq
= new PriorityQueue<>((a, b) -> b - a);
public void add(int value) {
minPq.add(value);
maxPq.add(value);
size++;
}
public void removeMax() {
if (size == 0) return;
maxPq.poll();
if (--size == 0) {
maxPq.clear();
minPq.clear();
}
}
public void removeMin() {
if (size == 0) return;
minPq.poll();
if (--size == 0) {
maxPq.clear();
minPq.clear();
}
}
public int max() {
if (size == 0) return 0;
return maxPq.peek();
}
public int min() {
if (size == 0) return 0;
return minPq.peek();
}
}
public int[] solution(String[] operations) {
DoublyPriorityQueue dpq = new DoublyPriorityQueue();
for (String operation : operations) {
String[] tokens = operation.split(" ");
String command = tokens[0];
String value = tokens[1];
switch (command) {
case "I" -> dpq.add(Integer.parseInt(value));
case "D" -> {
if (value.equals("1")) {
dpq.removeMax();
} else {
dpq.removeMin();
}
}
}
}
return new int[]{dpq.max(), dpq.min()};
}
}