ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 우선순위 큐 (c++)
    코딩테스트 준비 2021. 11. 4. 01:14
     

    우선순위 큐에 대한 문제로 백준 11279, 1927, 11286, 1655번을 풀었다.

     

    11279, 1927, 11286은 기본적인 우선순위 큐에 대한 문제

     

    priority_queue<자료형> 변수명 

    ex) priority_queue<int, vector<int>, greater<int>> : 오름차순 정렬 

    push(element) : 원소 삽입

    pop() : 맨앞 원소 삭제

    top() : 맨앞 원소 반환

    size() : 크기 반환

    empty() : 비어있는 지(true or false)

    이러한 기본함수만 알면 풀 수 있다.

     

    하지만 1655번은 좀 어려웠다...

    가운데 원소를 출력하는 문제였다. 처음에는 vector로 접근해서 sort()을 이용해 가운데 원소를 반환했는데 시간 초과가 나왔다.

    priority_queue로 접근해야 하는데 priority_queue로는 중간 인덱스를 사용하지 못하고 오직 top 원소만 반환받을 수 있어서 좀 어려웠다.

     

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

     

    1655번: 가운데를 말해요

    첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1

    www.acmicpc.net

    priority_queue 를 이용해 중간값을 찾으려면 maxheap 과 minheap 두개를 만들어 풀면 중간 값을 찾을 수 있다.

     

    1655.cpp

    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
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    #include<string>
    #include<math.h>
    #include<queue>
     
    using namespace std;
     
     
     
    int main() {
     
        priority_queue<intvector<int>, greater<int>> minheap;
        priority_queue<int> maxheap;
        int n;
        cin >> n;
        int k;
        cin >> k;
        maxheap.push(k);
        cout << k <<"\n";
        for (int i = 1; i < n; i++) {
            int temp;
            cin >> temp;
            if (maxheap.size() > minheap.size()) {
                minheap.push(temp);
            }
            else {
                maxheap.push(temp);
                
            }
     
            if (maxheap.top() > minheap.top()) {
                int t = minheap.top();
                minheap.pop();
                minheap.push(maxheap.top());
                minheap.pop();
                minheap.push(t);
            }
            cout << maxheap.top();
            cout << "\n";
            
        }
     
    }
    cs

     

    '코딩테스트 준비' 카테고리의 다른 글

    백준 2667 c++  (0) 2022.06.28
    백준 1520 c++  (0) 2022.06.28
    백준2606  (0) 2022.06.27
    백준 11049  (0) 2022.06.27
    백준 11066 c++  (0) 2022.06.23
Designed by Tistory.