[프로그래머스 C++] 이중우선순위큐

 

https://school.programmers.co.kr/learn/courses/30/lessons/42628

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


 

 

 

해결전략

 

덱 deque

우선순위큐 priority_queue

 


 

 

정답코드 - deque 사용

 

#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> oper) {
vector<int> answer;
deque<int> dQ;
for (int i = 0; i < oper.size(); i++)
{
if (oper[i][0] == 'I') {
int num = stoi(oper[i].substr(2)); // 문제에서 주어진 숫자 int 변환
dQ.push_back(num);
sort(dQ.begin(), dQ.end()); // deque 퀵정렬
}
else if (oper[i][0] == 'D') {
if (oper[i][2] == '1') {
if (!dQ.empty()) dQ.pop_back();
}
else if (oper[i][2] == '-') {
if (!dQ.empty()) dQ.pop_front();
}
}
}
if (dQ.empty()) {
answer.emplace_back(0);
answer.emplace_back(0);
}
else {
answer.emplace_back(dQ.back());
answer.emplace_back(dQ.front());
}
return answer;
}

 


 

 

 

 

정답코드 - priority_queue 사용

 

#include <iostream>
#include <string>
#include <vector>
#include <queue>
using namespace std;
vector<int> solution(vector<string> oper) {
vector<int> answer;
priority_queue<int> pQ; // 내림차순
priority_queue<int, vector<int>, greater<int>> revpQ; // 오름차순
for (int i = 0; i < oper.size(); i++)
{
if (oper[i][0] == 'I') { // 삽입
int num = stoi(oper[i].substr(2)); // 숫자 추출
pQ.push(num);
revpQ.push(num);
}
else if (oper[i][0] == 'D') { // 삭제
if (oper[i][2] == '1') {
if (pQ.empty()) continue;
if (!revpQ.empty() && pQ.top() == revpQ.top()) revpQ.pop(); // 최대 힙과 최소 힙의 최댓값이 같다면 최소 힙에서도 제거
pQ.pop();
}
else if (oper[i][2] == '-') {
if (revpQ.empty()) continue;
if (!pQ.empty() && pQ.top() == revpQ.top()) pQ.pop(); // 최소 힙과 최대 힙의 최솟값이 같다면 최대 힙에서도 제거
revpQ.pop();
}
}
if (pQ.top() < revpQ.top()) // 만약 최대 힙의 최댓값이 최소 힙의 최솟값보다 작다면
{
while (!pQ.empty()) pQ.pop();
while (!revpQ.empty()) revpQ.pop();
}
}
if (pQ.empty() || revpQ.empty()) {
answer.emplace_back(0);
answer.emplace_back(0);
}
else {
answer.emplace_back(pQ.top());
answer.emplace_back(revpQ.top());
}
return answer;
}