백준문제풀이

백준 문제 1655번 가운데를 말해요 문제풀이 c++

노가다 김씨 2022. 4. 3. 23:41

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

 

1655번: 가운데를 말해요

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

www.acmicpc.net

 

문제해석

이 문제는 예전에 풀어봤던 2696번 중앙값 구하기 https://www.acmicpc.net/problem/2696 이것과 같은 문제이다.

 

아이디어는 이렇다.

우선순위큐 두개를 선언하는데 하나는 오름차순 하나는 내림차순으로 한다.

 

항상 왼쪽 우선순위 큐 내의 모든숫자의 숫자는 중앙 값보다 작은 값이 

오른쪽 우선순위 큐 내의 모든숫자는 중앙 값보다 크게 조절을 하자

 

입력을 받을 때 마다 입력값과 왼쪽 pq의 최댓 값 오른쪽pq의 최솟 값을 비교하여 조절 한 후 중앙값을 출력하면 된다.

 

 

코드

 

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
priority_queue <int> pq1;
priority_queue < int, vector<int>, greater<int> > pq2;
int main(){
    cout.tie(NULL);
    cin.tie(NULL);
    ios_base::sync_with_stdio(false);
    int n,input,mid; cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>input;
        if(i==1)
        {
            mid=input;
        }
        else if(i==2)
        {
            if(mid<input)
            {
                pq2.push(input);
            }
            else
            {
                pq2.push(mid);
                mid=input;
            }
        }
        else
        {
            if(mid<input)
            {
                pq2.push(input);
            }
            else
            {
                pq1.push(input);
            }
            if(i&1)
            {
                if(pq1.size()<pq2.size())
                {
                    while(pq1.size()!=pq2.size())
                    {
                        pq1.push(mid);
                        mid=pq2.top();
                        pq2.pop();
                    }
                }
            }
            else
            {
                if(pq1.size()==pq2.size()+1)
                {
                    pq2.push(mid);
                    mid=pq1.top();
                    pq1.pop();
                }
            }
        }
        cout<<mid<<"\n";
    }
}