ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 7662 (이중 우선순위 큐) c++
    백준 문제 2022. 8. 16. 00:03
    728x90

    문제

     

    7662번: 이중 우선순위 큐

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

    www.acmicpc.net

    명령문을 입력 받습니다.

    예를 들어 

    I 60 이면 벡터에 60을 삽입합니다.

    D -1 이면 벡터 값 중에 최솟값을 삭제합니다.

    D 1 이면 벡터 값 중에서 최댓값을 삭제합니다. 

    k개의 명령문이 끝나고 남아있는 벡터의 최댓값과 최솟값을 출력하면 되는 문제입니다.

    만약 벡터가 비어있으면 "EMPTY"를 출력하면 됩니다.

     

    처음에 생각한 방안은 priority queue를 오름차순과 내림차순으로 두가지의 큐를 관리해

    D 명령어를 처리하는 방식입니다.

    하지만 이렇게 되면 오름차순에서 삭제된 원소가 내림차순에 존재하게 됩니다. 반대도 마찬가지 입니다.

    따라서 추가적인 장치가 필요합니다.

    바로 MAP을 이용하는 것입니다. 

     

    문제에서 삽입되는 원소들은 중복으로 주어질 수 있으니까 MAP을 <int, int>로 선언해 

    만약  "I 58" 이라는 명령어가 들어오면 <58, 1> 로 삽입해 주고 또 58이 들어오면 MAP[58]++하게 해주면 됩니다.

    즉, MAP을 이용해 삽입된 원소와 삭제된 원소를 체크해주고 D 명령문이 들어올 때마다 정리해주면 됩니다.


    전체 코드입니다.

    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
    75
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <stack>
    #include <queue>
    #include <deque>
    #include <cmath>
    #include <map>
    #include <set>
    #include <tuple>
    #define MAX 2100000000
    #define inf LONG_MAX
    #define big(a, b) a > b ? a : b
    using namespace std;
    using ll = long long;
    using ull = unsigned long long;
    int main() {
        ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
        int t;
        cin >> t;
        while (t--) {
            map<intint>m;
            priority_queue<int>up;
            priority_queue<intvector<int>, greater<int>>down;
            vector<int>v;
            int k;
            cin >> k;
            for (int i = 0; i < k; i++) {
                char c;
                cin >> c;
                if (c == 'I') {
                    int a;
                    cin >> a;
                    up.push(a);
                    down.push(a);
                    if (m.count(a) == 0)
                        m[a] = 1;
                    else
                        m[a]++;
                }
                else {
                    int a;
                    cin >> a;
                    if (a == -1 && !down.empty()) {
                        if (!m[down.top()]) 
                            while (!down.empty() &&!m[down.top()])down.pop();
                        if (!down.empty()) {
                            m[down.top()]--;
                            down.pop();
                        }
                    }
                    else if (a == 1 && !up.empty()) {
                        if (!m[up.top()])
                            while (!up.empty()&&!m[up.top()])up.pop();
                        if (!up.empty()) {
                            m[up.top()]--;
                            up.pop();
                        }
                    }
                }
            }
            if (!up.empty())while (!up.empty() && !m[up.top()])up.pop();
            if (!down.empty())while (!down.empty()&&!m[down.top()])down.pop();
     
            if (up.empty() && down.empty()) cout << "EMPTY" << '\n';
            else cout << up.top() << ' ' << down.top() << '\n';
     
        }
        
     
        return 0;
    }
     
    cs

    '백준 문제' 카테고리의 다른 글

    백준 14500 (테트로미노) c++  (0) 2022.08.21
    백준 9019 (DSLR) C++  (0) 2022.08.18
    백준 5430 (AC) C++  (0) 2022.08.10
    백준 1107 (리모컨) c++  (0) 2022.08.09
    백준 6064 (카잉 달력) c++  (0) 2022.08.07
Designed by Tistory.