[백준] 중앙값 구하기 #2696

welchs·2022년 2월 13일
0

알고리즘

목록 보기
34/44
post-thumbnail

설명

왼쪽에 최대힙, 중앙값, 오른쪽에 최소힙으로 구성한다.
숫자를 입력받고, 현재 middle 값과 비교해서 왼쪽에 넣을지 오른쪽에 넣을지 비교.
홀수개 입력받을 때마다 middle 값을 적절히 조절해준다.

풀이

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int T; cin >> T;
    while(T--) {
        priority_queue<int> left;
        priority_queue<int, vector<int>, greater<int>> right;
        vector<int> answer;
        int N; cin >> N;
        int middle; cin >> middle;
        answer.push_back(middle);
        for (int i=1; i<N; i++) {
            int num; cin >> num;
            if (num < middle) left.push(num);
            else right.push(num);
            
            if (i%2 == 0) {
                if (left.size() < right.size()) {
                    left.push(middle);
                } else {
                    right.push(middle);
                }
                
                if (left.size() < right.size()) {
                    middle = right.top();
                    right.pop();
                } else {
                    middle = left.top();
                    left.pop();
                }
                answer.push_back(middle);
            }
        }
        cout << answer.size();
        for (int i=0; i<answer.size(); i++) {
            if (i%10 == 0) cout << '\n';
            cout << answer[i] << ' ';
        }
        cout << '\n';
    }
    return 0;
}
profile
고수가 되고 싶은 조빱

0개의 댓글