#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<int> solution(vector<string> v) {
priority_queue<int> max;
priority_queue<int, vector<int>, greater<int>> min;
for (int i = 0; i < v.size(); i++) {
if (v[i][0] == 'I') {
max.push(stoi(v[i].substr(2)));
min.push(stoi(v[i].substr(2)));
} else if (!max.empty() && !min.empty() && max.top() == min.top()) {
while (!max.empty()) max.pop();
while (!min.empty()) min.pop();
} else if (v[i].substr(0, 4) == "D -1" && !min.empty()) {
min.pop();
} else if (v[i].substr(0, 4) == "D 1" && !max.empty()) {
max.pop();
}
}
return min.empty() && max.empty() || min.top() == max.top()
? vector<int>(2, 0)
: vector<int>{max.top(), min.top()};
}
vector나 multiset을 활용해서 풀어도 됐을 것 같은데 문제 분류가 Heap이라 2개의 Priority Queue로 풀었다.
MaxHeap, MinHeap인 2개의 우선순위 큐를 만들고 'I' 명령어가 들어온다면 모든 Heap에 push한다.
그리고 최솟값을 삭제하는 명령어가 나오면 Min Heap을 pop, 최댓값을 삭제하는 명령어가 나오면 Max Heap을 pop 했다. 이런 로직을 활용한다면 최댓값과 최솟값을 모두 활용하는 우선순위 큐를 만들 수 있다.
하지만 2개의 힙이 empty가 아닌데 2개의 힙의 top이 서로 같다면 이중우선순위큐가 빈 것과 같다.
그러므로 2개의 heap을 비워준다.
그리고 반복문을 마친 후 2개의 heap이 비었거나 top이 서로 같다면 빈 것과 같기 때문에 0,0을 return하고,
그렇지 않다면 최댓값과 최솟값이 존재하는 상태이기 때문에 max의 최댓값과 min의 최솟값을 return한다.