백준 중앙값 구하기 (우선순위큐, python)

728x90
반응형

문제

어떤 수열을 읽고, 홀수번째 수를 읽을 때 마다, 지금까지 입력받은 값의 중앙값을 출력하는 프로그램을 작성하시오.

예를 들어, 수열이 1,5,4,3,2 이면, 홀수번째 수는 1번째 수, 3번째 수, 5번째 수이고, 1번째 수를 읽었을 때 중앙값은 1, 3번째 수를 읽었을 때는 4, 5번째 수를 읽었을 때는 3이다.

입력

첫째 줄에 테스트 케이스의 개수 T(1<=T<=1,000)가 주어진다. 각 테스트 케이스의 첫째 줄에는 수열의 크기 M(1<=M<=9999, M=홀수)이 주어지고, 그 다음 줄부터 이 수열의 원소가 차례대로 주어진다. 원소는 한 줄에 10개씩 나누어져있고, 32비트 부호있는 정수이다. (대부분의 언어에서 int)

출력

각 테스트 케이스에 대해 첫째 줄에 출력하는 중앙값의 개수를 출력하고, 둘째 줄에는 홀수 번째 수를 읽을 때 마다 구한 중앙값을 차례대로 공백으로 구분하여 출력한다. 이때, 한 줄에 10개씩 출력해야 한다.

예제 입력 1 복사

3 9 1 2 3 4 5 6 7 8 9 9 9 8 7 6 5 4 3 2 1 23 23 41 13 22 -3 24 -31 -11 -8 -7 3 5 103 211 -311 -45 -67 -73 -81 -99 -33 24 56

예제 출력 1 복사

5 1 2 3 4 5 5 9 8 7 6 5 12 23 23 22 22 13 3 5 5 3 -3 -7 -3

 

---

쉬운 줄 알고 풀었다가 피눈물... 파이썬 입력받는 문법들 아직 잘 몰라서 이것저것 해봤는데 힘들었다 ㅠㅠ 

우선순위큐로 중앙값 찾기를 활용하되, 입력을 받을 때 중간에 엔터가 있는 부분을 따로 처리해줘야 된다. 

extend로 기존 배열을 확장했다.

 

짝수마다 출력하고 10의 배수일때마다 출력할 때 줄 넘김을 해준다.

import heapq
import sys

t=int(sys.stdin.readline())
while t>0:
    flag=0
    m=int(sys.stdin.readline())
    minhq=[]
    maxhq=[]
    print((m+1)//2)
    a=[int(num) for num in sys.stdin.readline().split()]
    for j in range(m//10):
        a.extend(list(map(int,sys.stdin.readline().split())))           
    for i,x in enumerate(a):
        if len(minhq)==len(maxhq):
            heapq.heappush(maxhq,-x)
        else:
            heapq.heappush(minhq,x)

        if minhq and minhq[0]<-maxhq[0]:
            mx=-heapq.heappop(maxhq)
            mn=heapq.heappop(minhq)
            heapq.heappush(maxhq,-mn)
            heapq.heappush(minhq,mx)
        if (i+1)%2:
            flag+=1
            print(-maxhq[0],end=' ')
            if flag%10==0: print()
    print()
    t-=1


    
728x90
반응형
TAGS.

Comments