본문 바로가기
알고리즘/알고리즘 문제풀이

[BOJ-7662] 이중 우선순위 큐(C++)

by E145 2021. 9. 30.
반응형

 

백준 7662 이중 우선순위 큐

 

 

7662번: 이중 우선순위 큐

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

www.acmicpc.net

 

문제 설명

 

 - 이중 우선순위 큐를 구현하여, 데이터 삽입과 삭제 연산을 구현하라.

 

 - 데이터 삭제 시 우선순위가 가장 높은 것과 가장 낮은 것을 삭제할 수 있다.

 

 - Q에 적용될 연산을 처리한 후 최종적으로 Q에 저장된 데이터 중 최댓값과 최솟값을 출력하라.

 

 - 연산 후 Q가 비어있다면, "EMPTY"를 출력하라.

 


 

입력 값

 

 - 테스트 데이터 T가 주어진다.

 

 - 각 테스트 데이터 첫째 줄에는 Q에 적용할 연산의 개수를 나타내는  K가 주어진다.

   ( K <= 1,000,000 )

 

 - 이어지는 K줄 각각엔 연산을 나타내는 문자('D' 또는 'I')와 정수 n이 주어진다.

 

 - 'I n'은 정수 n을 Q에 삽입하는 연산을 의미한다.

 

 - 'D 1'은 Q에서 최댓값을 삭제하는 연산을 의미한다.

 

 - 'D -1'은 Q에서 최솟값을 삭제하는 연산을 의미한다.

 

 - 최댓값(최솟값)을 삭제하는 연산에서 최댓값(최솟값)이 둘 이상인 경우, 하나만 삭제된다.

 

 - Q가 비어있는데 적용할 연산이 'D' 라면 이 연산은 무시해도 된다.

 

 - Q에 저장될 모든 정수는 32비트 정수이다.

 


 

 

예제

 


 

 

문제 분석

 

 - 이 문제는 우선순위큐를 이용하는 문제이다.

 

 - C++에서 제공하는 multiset을 이용하면, 중복 값을 허용하는 heap 자료구조를 사용할 수 있다.

 

 - 여기서 주의할 점은 노드 삭제 시 값으로 삭제하게 된다면 중복 값이 모두 삭제된다는 점이다.

 

 


 

 

소스 코드

 

#include <bits/stdc++.h>
#include <cstdlib>
#include<unordered_map>
#include<unordered_set>
using namespace std;

multiset<int> ms;

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int tc,t;

	cin >> tc;

	for (int i = 0; i < tc; i++) {

		ms.clear();

		cin >> t;

		char oper;
		int n;

		for (int j = 0; j < t; j++) {
			cin >> oper >> n;

			if (oper == 'I') {
				ms.insert(n);
			}
			else {
				if (ms.empty()) {
					continue;
				}

				if (n == 1) {
					int val = *ms.rbegin();
					int cnt = ms.count(val);
					ms.erase(*ms.rbegin());

					if (cnt > 1) {
						for (int i = 1; i < cnt; i++) {
							ms.insert(val);

						}
					}

				}
				else {
					ms.erase(ms.begin());

				}
			}

		}

		if (ms.empty()) {
			cout << "EMPTY\n";
		}
		else {
			cout << *ms.rbegin() << " " << *ms.begin() << "\n";
		}
		
	}

	return 0;
}

 

 

반응형

'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글

[BOJ-2118] 두 개의 탑(JAVA)  (0) 2021.10.11
[BOJ-17609] 회문 (JAVA)  (0) 2021.10.10
[BOJ-5427] 불(JAVA)  (0) 2021.09.29
[BOJ-2157] 여행(JAVA)  (0) 2021.09.28
[BOJ-9935] 문자열 폭발(JAVA)  (0) 2021.09.27

댓글