본문 바로가기

baekjoon

2696번 중앙값 구하기

 

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

 

2696번: 중앙값 구하기

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스의 첫째 줄에는 수열의 크기 M(1 ≤ M ≤ 9999, M은 홀수)이 주어지고, 그 다음 줄부터 이 수열의 원소가 차례대로 주

www.acmicpc.net

중앙값 : 정렬된 숫자중에 중앙에 있는 숫자.

 

해결법 : 우선순위 큐 2개를 이용해 풀기

                1 2 3 일때  2가 중앙값, 1 2 3 4 5 일때 3이 중앙값, 1 2 3 4 5 6 7 일때 4가 중앙값 따라서 내림차순 큐와 오름차순 큐를 이용                   해 중앙값 찾기.

 

 1. max큐는 내림차순이며 top값이 항상 중앙값이 된다.
 2. min큐는 오름차순이며 max큐의 top값보다 항상 크다.
 3. 처음 초기값은 입력받는 수 이다.
 4. i=2부터는 만약 max큐가 min큐보다 사이즈가 크고 max큐의 top값이 inptu값보다 크다면 input값으로 중앙값을

   업데이트 시키고 max큐의 탑값을 min큐로 넣어준다.
    ex) maxQ{1,3,4},minQ{5,6}이면 중앙값은 항상 maxQ의 탑이므로 4가 된다.
 5. 만약 max큐와 min큐의 사이즈가 같고 input값이 max큐의 탑값 보다 크다면 min큐에 input값을 넣고 그중에서 제일 작은값이         중앙값이 되므로 max큐에 넣는다
     ex) maxQ{1,2}, minQ{3,4}일때 중앙값은 3 이므로 maxQ{1,2,3},minQ{4}가 된다.
 6. max큐와 min큐의 사이즈가 같지만 input값이 max큐의 탑값보다 작다면 그냥 max큐에 넣는다.

 

 

ex) n = 5 ,    1, 5, 4, 3, 2일때

 

input : 1      MaxQ{1}, MinQ{}

input : 5     MaxQ.top() < 5 이므로 MaxQ{1}, MinQ{5}

input : 4     MaxQ.top() < 4 이므로 MaxQ{4,1}, MinQ{5}

input : 3     MaxQ.top() < 3 이므로 MaxQ{3,1}, MaxQ{4,5}

input : 2     MaxQ.top() > 2 이므로 MaxQ{3,2,1}, MinQ{4,5}

  

#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
using namespace std;


int main() {
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);

    l t,m,num;
    cin >> t;

    while(t--){
        priority_queue<l,vector<l>,greater<>> MinQ;     //오름차순
        priority_queue<l,vector<l>,less<>> MaxQ;        //내림차순
        int cnt = 0;
        cin >> m;
        cout << m /2 + 1 << "\n";
        for(int i=1;i<=m;i++){
            cin >> num;

            if(MinQ.empty() && MaxQ.empty()) MaxQ.push(num);
            else if(MaxQ.size() > MinQ.size()){
                if(MaxQ.top() > num){
                    MaxQ.push(num);
                    MinQ.push(MaxQ.top());MaxQ.pop();
                }
                else MinQ.push(num);
            }
            else if(MaxQ.size() == MinQ.size()){
                if(MaxQ.top() < num){
                    MinQ.push(num);
                    MaxQ.push(MinQ.top());MinQ.pop();
                }
                else MaxQ.push(num);
            }

            if(i % 2 == 1){
                cout << MaxQ.top() << " ";
                cnt++;
                if(cnt % 10 == 0) cout << "\n";
            }
        }
        cout << "\n";
    }

}

'baekjoon' 카테고리의 다른 글

2357번 최솟값과 최댓값  (0) 2022.03.21
10868번 최솟값  (0) 2022.03.21
11505번 구간 곱 구하기  (0) 2022.03.21
2042번 구간 합 구하기  (0) 2022.03.21
1655번 가운데를 말해요  (0) 2022.03.21