[프로그래머스 Lv3] 42628 : 이중우선순위큐

수민이슈·2023년 10월 16일
0

[C++] 코딩테스트

목록 보기
95/116
post-thumbnail

🖊️ 문제

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;
}

그거나 그거나지만...
사실 백준에서 풀었던 문제랑 알고보니 완전 똑같은거라 !! 그냥 복습했다구 생각해야겠다.

0개의 댓글