BAEKJOON
[Python/Gold2/2696] 중앙값 구하기
콘순이
2025. 2. 12. 23:17
| 문제
어떤 수열을 읽고, 홀수번째 수를 읽을 때 마다, 지금까지 입력받은 값의 중앙값을 출력하는 프로그램을 작성하시오.
예를 들어, 수열이 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비트 부호있는 정수이다.
| 출력
각 테스트 케이스에 대해 첫째 줄에 출력하는 중앙값의 개수를 출력하고, 둘째 줄에는 홀수 번째 수를 읽을 때 마다 구한 중앙값을 차례대로 공백으로 구분하여 출력한다. 이때, 한 줄에 10개씩 출력해야 한다.
정답 코드
import sys, heapq
input = sys.stdin.readline
class Solution:
def mid_value(self):
T = int(input())
for _ in range(T):
m = int(input()) # 수열의 크기
arr = []
for _ in range(m//10 + 1):
a = list(map(int, input().split()))
arr.extend(a)
less = []
more = []
res = []
res.append(arr[0])
mid = arr[0]
for idx, v in enumerate(arr[1:], 1):
if v < mid:
heapq.heappush(less, -v)
else:
heapq.heappush(more, v)
if idx % 2 == 0:
if len(less) > len(more):
heapq.heappush(more, mid)
mid = -heapq.heappop(less)
elif len(less) < len(more):
heapq.heappush(less, -mid)
mid = heapq.heappop(more)
res.append(mid)
print(len(res))
for i in range(0, len(res), 10):
print(*res[i:min(len(res), i+10)])
if __name__ == "__main__":
s = Solution()
s.mid_value()
| 비고
가운데를 말해요 상위버전. 사실 핵심적인 부분은 같다. mid값 기준 작은 값들은 less배열에, mid값 기준 큰 값들은 more배열에 넣고 값을 비교하여 중앙값을 새로 지정해주면 된다.