백준 중앙값 구하기 (우선순위큐, python)
문제
어떤 수열을 읽고, 홀수번째 수를 읽을 때 마다, 지금까지 입력받은 값의 중앙값을 출력하는 프로그램을 작성하시오.
예를 들어, 수열이 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
'백준' 카테고리의 다른 글
[백준] 2252번 줄세우기( 파이썬, 위상정렬) (0) | 2020.10.10 |
---|---|
백준 10282번 해킹(파이썬) (0) | 2020.10.08 |
백준 1753번 다익스트라 (파이썬) (0) | 2020.10.08 |
[백준] 1260번 bfs와 dfs (python, java) (0) | 2020.10.07 |
가운데를 말해요 (python, 우선순위큐) (0) | 2020.10.03 |