IT/알고리즘
[백준 Python] 2696번 중앙값 구하기
와잉
2025. 2. 23. 15:51
백준 파이썬 2696번 중앙값 구하기
Gold 2
https://www.acmicpc.net/problem/2696
import sys
input = sys.stdin.readline
for _ in range(int(input())):
m = int(input())
arr, q = [], []
for _ in range(m//10+1):
arr += list(map(int, input().split()))
print((m+1)//2)
for idx in range(m):
q.append(arr[idx])
q.sort()
if idx%20 == 0 and idx!=0:
print()
if idx % 2 == 0:
print(q[len(q)//2], end=" ")
print()
중앙값 구하기로 heapq를 사용하지 않아도 정답 처리가 되기는 한다.
하지만 heapq를 사용해서 시간을 줄일 수 있다.
mid 의 값을 기준으로 왼쪽(작은 수)큐와 오른쪽(큰 수)큐를 생성하고 값을 빼준다.
import sys
import heapq
input = sys.stdin.readline
for _ in range(int(input())):
m = int(input())
arr = []
for _ in range(m//10 + 1):
arr += list(map(int, input().split()))
l, r = [], []
mid = arr[0]
s = [mid]
arr.pop(0)
idx = 2
for a in arr:
if a < mid:
heapq.heappush(l, -a) #mid와 가까운 수를 pop하기 위해 -값을 넣어준다.
else:
heapq.heappush(r, a)
#print("left: ", l)
#print("right: ", r)
if idx % 2 == 1:
if len(l) > len(r):
heapq.heappush(r, mid)
mid = -heapq.heappop(l)
if len(l) < len(r):
heapq.heappush(l, -mid)
mid = heapq.heappop(r)
s.append(mid)
idx += 1
#print("mid: ",mid)
print(len(s))
for i in range(len(s)):
if i != 0 and i % 10 == 0:
print()
print(s[i], end=' ')
print()
다음 예시에서 다음과 같은 출력값을 가지며, 시간 또한 줄어든 것을 확인할 수 있다.
반응형