레야몬

[C++] 7662번 이중 우선순위 큐 - 우선순위 큐, 트리 본문

알고리즘/백준

[C++] 7662번 이중 우선순위 큐 - 우선순위 큐, 트리

Leyamon 2022. 8. 29. 20:28

결과적으론 나는 이 문제를 푸는 데 실패하였고 더 이상 C언어로 알고리즘 코드를 짜는 것은 힘들다고 생각하였다. 그래서 C언어에서 C++언어로 바꾸기로 하였고 코드는 다른 사람의 블로그에서 가져왔다. 그대로 가져왔고 내가 짠 코드는 절대 아니다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>

using namespace std;

priority_queue<int, vector<int>, greater<int>> min_pq;
priority_queue<int, vector<int>, less<int>> max_pq;
map<int, int> dict;

int T, k, n;
char c;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    cin >> T;
    
    while (T) {
        while (!min_pq.empty()) {min_pq.pop();}
        while (!max_pq.empty()) {max_pq.pop();}
        dict.clear();
        
        cin >> k;
        
        for (int i=0; i<k; i++) {
            cin >> c >> n;
            
            if (c=='I') {
                min_pq.push(n);
                max_pq.push(n);
                
                if (!dict.count(n))
                    dict[n]=1;
                else
                    dict[n]++;
            }
            else {
                if (n==1) {
                    while (!max_pq.empty() && !dict[max_pq.top()])
                        max_pq.pop();
                    if (!max_pq.empty()) {
                        dict[max_pq.top()]--;
                        max_pq.pop();
                    }
                }
                else {
                    while (!min_pq.empty() && !dict[min_pq.top()])
                        min_pq.pop();
                    if (!min_pq.empty()) {
                        dict[min_pq.top()]--;
                        min_pq.pop();
                    }
                }
            }
        }
        
        while (!max_pq.empty() && !dict[max_pq.top()])
            max_pq.pop();
        while (!min_pq.empty() && !dict[min_pq.top()])
            min_pq.pop();
        
        if (max_pq.empty() || min_pq.empty())
            cout << "EMPTY\n";
        else
            cout << max_pq.top() << " " << min_pq.top() << "\n";
        
        T--;
    }
    
    return 0;
}

 

 

나는 C++언어를 접한 것이 이번이 처음이기 때문에 이 코드를 이해하는데 상당히 많은 시간을 썼다. 링크는 아래에 있다.

 

 

<코드 출처>

https://please-amend.tistory.com/entry/%EB%B0%B1%EC%A4%80-7662%EB%B2%88-%EC%9D%B4%EC%A4%91-%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84-%ED%81%90-Ccpp-%ED%92%80%EC%9D%B4

 

백준 7662번 이중 우선순위 큐 - C++(cpp) 풀이

문제 제목에서부터 알 수 있듯이 우선순위 큐를 써야 하는데, 스위프트에는 라이브러리로 우선순위 큐를 제공하지 않아서 C++로 풀었다. 1. 최댓값은 최댓값 큐에서 찾는다. 2. 최솟값은 최솟값

please-amend.tistory.com

 

<switch문 컴파일 에러>

https://blankspace-dev.tistory.com/386

 

[C++] switch case문 jump to case label 오류 문제 해결 방법

switch case 문을 사용하다보면 아래와 같은 에러가 발생할 경우가 있다. 1 error: jump to case label [-fpermissive] cs 처음에는 이것에 대해서 이해할 수가 없었는데, 찾아보니 굉장히 간단한 문법 오류..

blankspace-dev.tistory.com

 

<C++ 큐>

https://life-with-coding.tistory.com/408

 

[C++][STL] Queue 기본 사용법 및 예제

인트로 안녕하세요. 오늘은 C++의 STL중 하나인 Queue(큐) 기본 함수에 대해서 알아보도록 하겠습니다. Queue 는 자료구조의 대표적인 FIFO(First In First Out)인 알고리즘으로, 코딩테스트에 많이 나오는

life-with-coding.tistory.com

 

<C++ 벡터>

https://blockdmask.tistory.com/70

 

[C++] vector container 정리 및 사용법

안녕하세요.  BlockDMask 입니다. 오늘은 C++ STL의 sequence container 중에 정말 자주 쓰는 vector에 대해서 알아보겠습니다. <목차> 1) vector container 란? 2) vector의 사용 3) vector의 생성자와 연산..

blockdmask.tistory.com

 

<C++ greater, less>

https://xzio.tistory.com/272

 

[STL] less, greater, plus, minus 예제

[STL] less, greater, plus, minus 예제 STL 에는 유용하게 사용할 수 있는 함수 객체가 내장돼 있다. less : 첫번째 인자가 두번째 인자보다 작으면 true 반환 (bool) greater : 첫번째 인자가 두번째 인자보다..

xzio.tistory.com

 

<C++ map>

https://life-with-coding.tistory.com/305

 

[C++][STL] map 사용법 정리

인트로 안녕하세요. 오늘은 C++ STL 연관 컨테이너 중 하나인 map에 대해 알려드리겠습니다. 목차 1) Map이란? 2) Map 기본 형태 3) Map 정렬 4) Map 사용방법 - 헤더 포함 - map 선언 - search : map에서 데이터..

life-with-coding.tistory.com

 

<ios_base::sync_with_stdio>

https://modoocode.com/281

 

C++ 레퍼런스 - ios_base::sync_with_stdio 함수

 

modoocode.com

 

<C++ cin, cout>

https://coding-factory.tistory.com/479

 

[C++] 입력문 / 출력문 (cin, cout) 사용법 & 예제

C언어에서는 에 있는 scanf, printf를 통해서 입출력문을 사용합니다. 물론 C++에서도 scanf, printf를 통해서 입력, 출력을 할수도 있지만 C++의 표준 입력 및 출력은 cin, cout를 사용합니다. std 네임스페

coding-factory.tistory.com

 

<cin.tie(NULL)>

https://ip99202.github.io/posts/%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EC%A4%84%EC%9D%B4%EA%B8%B0/

 

sync_with_stdio(false) cin.tie(NULL) cout.tie(NULL)

C++ 입출력 속도 C++의 cin과 cout은 scanf와 printf보다 속도가 느리다. 출력은 큰 차이는 아니지만 입력같은 경우는 2배 이상의 속도 차이가 난다.

ip99202.github.io

 

<C++ auto>

https://dydtjr1128.github.io/cpp/2019/06/04/Cpp-auto.html

 

C++ auto란? - dydtjr1128's Blog

auto? 1. Intro C++ 표준에 기록되어 있는 auto라는 키워드는 원래 의미와 수정된 의미가 정의되어 있다. C++11전에는 auto는 자동 저장소 클래스에...

dydtjr1128.github.io

 

<C++ priority_queue>

https://kbj96.tistory.com/15

 

[C++ STL] Priority_queue 사용법

본 글은 여러 PS 문제를 접하다 보면 우선순위 큐를 적극적으로 사용해야 되는 경우가 있는데 매번 구글링을 하게 되는 것 같아 우선순위 큐에 대한 기본적인 사용법뿐만 아니라 기본적인 자료

kbj96.tistory.com

 

 

※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.

 
Comments