문제를 푸는 과정은 다음과 같다.
1. for each operation in operations
2. determin operation type (insert or delete)
3. if operation is "insert"
4. insert number into double priority queue
5. else if operation is "delete min"
6. delete min value from double priority queue
7. else
8. delete max value from double priority queue
2번 라인을 위해 parse_operation() 함수를 만들어서 insert는 0, delete min은 -1, delete max는 1을 반환하도록 했다.
4번, 5번, 6번 라인을 위해 각각 insert_dpq(), delete_min(), delete_max() 함수를 만들었다.
이중우선순위큐를 직접 구현하는 대신 삽입 삭제 시 정렬이 되는 set 자료구조를 이용하였다.
#include <string>
#include <vector>
#include <set>
using namespace std;
int parse_operation(string &oper);
void delete_min(set<int> &dpq);
void delete_max(set<int> &dpq);
void insert_dpq(set<int> &dpq, int num);
vector<int> solution(vector<string> operations) {
vector<int> answer;
set<int> dpq; //set은 안에서 자동으로 정렬이 이루어진다. -> 우선순위 적용과 같은 효과
for (string &oper : operations) {
switch(parse_operation(oper)) {
case 0:
insert_dpq(dpq, stoi(oper.substr(2)));
break;
case 1:
delete_max(dpq);
break;
case -1:
delete_min(dpq);
break;
}
}
if (dpq.empty())
answer = {0,0};
else {
set<int>::iterator it = dpq.end();
answer = {*(it-1), *dpq.begin()};
}
return answer;
}
int parse_operation(string &oper) {
switch (oper[0]) {
case 'I':
return 0;
case 'D':
if (oper[2] == '-')
return -1;
return 1;
}
return -2;
}
void delete_min(set<int> &dpq) {
if (!dpq.empty())
dpq.erase(dpq.begin());
}
void delete_max(set<int> &dpq) {
if (!dpq.empty()) {
set<int>::iterator it = dpq.end();
dpq.erase(--it);
}
}
void insert_dpq(set<int> &dpq, int num) {
dpq.insert(num);
}