본문 바로가기

개발/알고리즘

중앙값

문제


정수가 N개 주어진다. 홀수번째 수가 주어질 때마다, 지금까지 주어진 수의 중앙값을 구하는 프로그램을 작성하여라.


예를 들어 1, 4, 5, 3, 6가 주어진다면, 첫번째 수인 1을 입력받을 때 중앙값이 1이고, 세 번째 수인 5를 입력받을 때까지의 중앙값이 4이고, 다섯번째 수인 6을 입력받을 때까지의 중앙값이 4이므로 1, 4, 4를 순서대로 출력하는 것이다.



입력


첫 번째 줄에 주어지는 정수의 개수 N이 주어진다. (1 ≤ N ≤ 99,999, N은 홀수)


두 번째 줄부터 N개의 줄에 걸쳐 각 줄에 하나씩 정수가 주어진다. (1 ≤ 주어지는 정수 ≤ 1,000,000,000)




출력


홀수번째 수를 입력받을 때마다 그 때까지 입력받은 정수들의 중앙값을 한 줄에 하나씩 출력한다.




힌트


입력 예제


7

8

8


출력 예제


1

5

3

5


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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <fstream>
#include <string.h>
#include <algorithm>
#include <set>
#include <queue>
  
  
//CenterValue ---------------------
void CenterValue();
//CenterValue ---------------------
int main(int argc, char** argv) {
    CenterValue();
    return 0;
}
  
int N;
  
struct comparator {
    bool operator () (int a, int b){
        return a > b;
    }
};
  
void CenterValue(){
    //LEFT QUEUE------CenterValue------RIGHTQUEUE
    std::priority_queue<int,std::vector<int>,comparator> rightQ;
    std::priority_queue<int> leftQ ;
    std::cin >> N;
    int V1, V2;
    int x = 0; //중심추
    int centerValue;
      
      
    std::cin>>centerValue; //값을 입력받고
  
    std::cout<< centerValue << std::endl;
    for(int i=0; i<N/2; i++){
        std::cin>>V1 >> V2; //값을 2개 입력 받음
        x = 0; //기준을 잡는다.
        if(V1 > centerValue){
            x++;
            rightQ.push(V1);
        }else{
            x--;
            leftQ.push(V1);
        }
          
        if(V2 > centerValue){
            rightQ.push(V2);
            x++;
        }else{
            x--;
            leftQ.push(V2);
        }
          
        if(x==0){ //기준이 안바뀜
              
        }else if(x>0){ //무게중심을 맞춰줌
            leftQ.push(centerValue);
            centerValue = rightQ.top();
            rightQ.pop();
        }else{
            rightQ.push(centerValue);
            centerValue = leftQ.top();
            leftQ.pop();
        }
        std::cout<< centerValue << std::endl;
    }
}


'개발 > 알고리즘' 카테고리의 다른 글

그래프 순회  (0) 2016.12.03
구간의 대표값  (0) 2016.12.03
보드 게임  (0) 2016.12.03
휴게소  (0) 2016.12.03
술 약속  (0) 2016.12.03