백준 2696 중앙값 구하기

실 패 !! 😢

문제

어디서 많이 본 것 같았는데 종만북에 있는 RUNNING MEDIAN 문제였다.

분류를 안주니까 모르겠다.

풀이

주어진 수열의 숫자들을 두 묶음으로 나누자!

  1. 최대 힙의 크기는 최소 힙의 크기와 같거나 하나 더 크다.
  2. 최대 힙의 최대 원소는 최소 힙의 최소 원소보다 작거나 같다.

우선순위 큐

minheap과 maxheap 두개를 사용하여 풀 수 있다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main() {
    int T;
    cin>>T;
    while(T--) {
        int m; cin>>m;
        priority_queue<int, vector<int>, greater<>> minHeap;
        priority_queue<int> maxHeap;
        cout<<(m+1)/2<<'\n';
        for(int i=1; i<=m; ++i) {
            int n; cin>>n;
            if(maxHeap.size()==minHeap.size())
                maxHeap.push(n);
            else
                minHeap.push(n);
            if(!minHeap.empty() && !maxHeap.empty() && minHeap.top()<maxHeap.top()) {
                int a=maxHeap.top(), b=minHeap.top();
                minHeap.pop(); maxHeap.pop();
                maxHeap.push(b);
                minHeap.push(a);
            }
            if(i%2==1) {
                cout<<maxHeap.top()<<" ";
            }
        }
        cout<<'\n';
    }
    //std::cout << "Hello, World!" << std::endl;
    return 0;
}

[jungin]
Written by@[jungin]
안녕하세요

GitHub