[BOJ] 이중우선순위큐

Date:

[BOJ] 이중우선순위큐

Problem URL : 이중우선순위큐

힙(우선순위 큐)을 이용한 풀이

#include <iostream>
#include <queue>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

vector<int> solution(vector<string> operations) {
    vector<int> answer;
    int cnt = 0;

    priority_queue<int> maxHeap;                             // 내림차순 (디폴트)
    priority_queue<int, vector<int>, greater<int>> minHeap;  // 오름차순
    char c;
    int n;
    for (int i = 0; i < operations.size(); i++) {
        c = operations[i][0];
        n = stoi(operations[i].substr(2));
        if (cnt == 0) {
            while (!maxHeap.empty()) maxHeap.pop();
            while (!minHeap.empty()) minHeap.pop();
        }
        if (c == 'I') {
            maxHeap.push(n);
            minHeap.push(n);
            cnt++;
        } else {
            if (cnt != 0) {
                if(n == 1) {
                    maxHeap.pop();
                }else{
                    minHeap.pop();
                }
                cnt--;
            }
        }
    }
    if (cnt == 0) {
        answer.push_back(0);
        answer.push_back(0);
    } else {
        answer.push_back(maxHeap.top());
        answer.push_back(minHeap.top());
    }
    return answer;
}

STL multiset을 이용한 풀이

#include <iostream>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

vector<int> solution(vector<string> operations) {
    vector<int> answer;
    int cnt = 0;
    multiset<int> ms;  // 오름차순(디폴트)
    char c;
    int n;
    for (int i = 0; i < operations.size(); i++) {
        c = operations[i][0];
        n = stoi(operations[i].substr(2));
        if (c == 'I')
            ms.insert(n);
        else {
            if(!ms.empty()) {
                if(n == 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;
}

Comments

풀이를 찾다가 multiset이라는 강력한 자료구조를 알게 되었다.
자동 정렬이 되고, 중복된 키 값을 가질 수 있는 자료구조이다.

댓글