문제풀이/백준oj

[백준OJ] 7662번 이중 우선순위 큐

Hyeon-Uk 2021. 6. 2. 00:29
반응형

https://www.acmicpc.net/problem/7662

 

7662번: 이중 우선순위 큐

입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적

www.acmicpc.net


 

-풀이-

먼저, 최대힙,최소힙을 가지는 우선순위큐 두개를 사용해도 되는데, multiset을 이용하면 보다 더 간단하게 해결된다.

오름차순 multiset을 선언한 뒤, I면 해당 숫자를 insert해주고, D라면, 1일땐 맨 뒤의 원소를, -1일땐 맨 앞의 원소를 제거해주면 된다.

multiset은 삽입과 동시에 정렬이 되므로, 따로 정렬을 해줄 필요는 없다.

 

 

프로그래머스에 같은 문제가 있다. 맨 마지막에 이중 우선순위큐를 사용하여 푼 프로그래머스  코드를 첨부하겠다.

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

 

코딩테스트 연습 - 이중우선순위큐

 

programmers.co.kr

 

 

-시간복잡도-

MultiSet:

원소의 개수를 N개라 한다면, 삽입,삭제에  O(logN) 이 걸리므로, T번 테스트케이스에 K번 쿼리를 하는것이므로, O(TKlogK)이 된다. (원소의 개수는 최대 K개이므로, K번 모두 삽입한경우)

 

 

-코드-

멀티셋을 이용한 코드

//MultiSet 을 이용한 풀이
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	int t;
	cin >> t;
	while (t--) {
		multiset<int> m;
		int sz = 0;
		int k, n;
		char op;
		cin >> k;
		for (int i = 0; i < k; i++) {
			cin >> op >> n;
			if (op == 'I') {
				m.insert(n);
			}
			else {
				if (m.empty()) continue;

				if (n == 1) {
					m.erase(--m.end());
				}
				else {
					m.erase(m.begin());
				}
			}
		}
		if (m.empty()) {
			cout << "EMPTY\n";
		}
		else {
			cout << *(--m.end()) << " " << *(m.begin()) << "\n";
		}
	}
	return 0;
}

2중 우선순위 큐를 이용한 코드

//2중 우선순위 큐를 이용한 풀이 [프로그래머스]
#include <string>
#include <vector>
#include<queue>
#include<iostream>
using namespace std;

vector<int> solution(vector<string> operations) {
    vector<int> answer(2);
    priority_queue<int> maxq,minq;
    int sz=0;
    for(int i=0;i<operations.size();i++){
        if(sz==0){
            while(!maxq.empty()) maxq.pop();
            while(!minq.empty()) minq.pop();
        }
        string op;
        string stnum;
        int num;
        op=operations[i].substr(0,1);
        stnum=operations[i].substr(2,operations[i].size()-2);
        num=stoi(stnum);
        
        if(op=="I"){
            sz++;
            maxq.push(num);
            minq.push(-num);
        }
        else{
            if(sz==0){
                continue;
            }
            else{
                if(num==1){
                    maxq.pop();
                    sz--;
                }
                else{
                    minq.pop();
                    sz--;
                }
            }
        }
    }
    if(sz){
        answer[0]=(maxq.top());
        answer[1]=(-minq.top());
    }
    
    return answer;
}
반응형