코딩 공부/백준

[백준][C++] 7662 이중 우선순위 큐

김 정 환 2021. 4. 21. 16:19
반응형

www.acmicpc.net/problem/7662

 

7662번: 이중 우선순위 큐

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

www.acmicpc.net

 

 

 

알고리즘 종류

자료구조

우선순위 큐

 

 

 

사고 과정

1. 최솟값과 최댓값을 저장할 우선순위 큐 2개가 필요합니다.

 

2. 최댓값을 저장한 우선순위 큐에서 최댓값을 제거하면, isVisited 배열에 해당 숫자를 제거했다고 표시합니다. 이렇게 표시하여 최솟값 우선순위 큐에서 해당 숫자를 처리할 수 있습니다.

 

 

 

 

구현(C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
 
using namespace std;
 
typedef long long ll;
 
int tc, n;
 
int isVisited[1000001]; // 큐에 있는 숮자인지 확인하는 배열  
 
int main(void){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    
    cin >> tc;
    
    while(tc--){
        priority_queue<pair<ll, ll> > maxPQ; // 숫자, 번호  
        priority_queue<pair<ll, ll> > minPQ;
        memset(isVisited, 0sizeof(isVisited));
        
        cin >> n;
        
        char c;
        ll x;
        for(int i=0; i<n; i++){
            cin >> c >> x;
            
            if(c == 'I'){
                maxPQ.push({x, i});
                minPQ.push({-x, i});
                isVisited[i] = 1;
            }
            else if(c == 'D' && x == 1){
                while(!maxPQ.empty()){ 
                    if(isVisited[maxPQ.top().second]) break;
                    maxPQ.pop();
                }
                if(!maxPQ.empty()){
                    isVisited[maxPQ.top().second] = 0;
                    maxPQ.pop();
                }
                
            }
            else if(c == 'D' && x == -1){
                while(!minPQ.empty()){
                    if(isVisited[minPQ.top().second]) break;
                    minPQ.pop();
                }
                if(!minPQ.empty()){
                    isVisited[minPQ.top().second] = 0;
                    minPQ.pop();
                }
                
            }
        }
        
        while(!maxPQ.empty()){
            if(isVisited[maxPQ.top().second]) break;
            maxPQ.pop();
        }
        
        while(!minPQ.empty()){
            if(isVisited[minPQ.top().second]) break;
            minPQ.pop();    
        }
        
        if(maxPQ.empty() || minPQ.empty()) cout << "EMPTY" << "\n";
        else cout << maxPQ.top().first << " " << -minPQ.top().first << "\n";
    }
}
cs

 

 

 

시행착오

반응형

'코딩 공부 > 백준' 카테고리의 다른 글

[백준][C++] 17298 오큰수  (0) 2021.04.22
[백준][C++] 1043 거짓말  (0) 2021.04.21
[백준][C++] 11000 강의실 배정  (0) 2021.04.21
[백준][C++] 1918 후위 표기식  (0) 2021.04.20
[백준][C++] 9081 단어 맞추기  (0) 2021.04.20