https://school.programmers.co.kr/learn/courses/30/lessons/42628
유사한 문제를 백준에서 풀어본 경험이 있어서, 접근이 수월했다.
multiset
을 쓰는 것.
다만, 우선순위 큐
를 2개 놓고 이를 이어주는 매개체로 multiset
을 썼다.
하지만 점수를 1점밖에 안주더라...
생각해보니, multiset
자체가 정렬을 해주기 때문에, 굳이 우선순위 큐
를 쓸 필요가 없었다.
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <iostream>
using namespace std;
vector<int> solution(vector<string> operations) {
vector<int> answer;
priority_queue<int> maxPq;
priority_queue<int, vector<int>, greater<int>> minPq;
multiset<int> ms;
string str = "";
int num = 0;
int maxNum = 0;
int minNum = 0;
for (string& op : operations) {
if (op[0] == 'I') {
str = op.substr(2, op.size());
num = atoi(str.c_str());
ms.insert(num);
maxPq.push(num);
minPq.push(num);
}
else if (op[2] == '1') {
if (!ms.empty() && !maxPq.empty()) {
do{
maxNum = maxPq.top();
maxPq.pop();
}
while(ms.find(maxNum) == ms.end());
ms.erase(maxNum);
}
}
else {
if (!ms.empty() && !minPq.empty()) {
do {
minNum = minPq.top();
minPq.pop();
}
while (ms.find(minNum) == ms.end());
ms.erase(minNum);
}
}
}
if (ms.empty()) {
answer.push_back(0);
answer.push_back(0);
}
else {
answer.push_back(*(--ms.end()));
answer.push_back(*ms.begin());
}
return answer;
}
다시 multiset만을 이용해서 푼 코드.
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <iostream>
using namespace std;
vector<int> solution(vector<string> operations) {
vector<int> answer;
multiset<int> ms;
int num = 0;
for (string& op : operations) {
if (op[0] == 'I') {
num = atoi(op.substr(2, op.size()).c_str());
ms.insert(num);
}
else if (op[2] == '1')
ms.erase(*(--ms.end()));
else
ms.erase(*ms.begin());
}
if (ms.empty()) {
answer.push_back(0);
answer.push_back(0);
}
else {
answer.push_back(*(--ms.end()));
answer.push_back(*ms.begin());
}
return answer;
}
그거나 그거나지만...
사실 백준에서 풀었던 문제랑 알고보니 완전 똑같은거라 !! 그냥 복습했다구 생각해야겠다.