728x90
[사용한 알고리즘]
우선순위 큐(Priority Queue)
[문제 접근]
두 개의 heap을 이용하여 중간값을 관리하였습니다. 왼쪽 힙을 left(max heap), 오른쪽 힙을 right(min heap)라고 가정하면 left와 right의 보유 원소 개수(길이)가 같으면 left에 무조건 삽입합니다. 이외에는 right에 삽입합니다. 그리고 만약 left의 가장 큰 값과 right의 가장 작은 값을 비교해서 left의 가장 큰 값이 더 크면 left의 가장 큰 값과 right의 가장 작은 값을 바꿔줍니다. 그러면 right의 가장 큰 값은 중간값이기 때문에 효율적으로 중간값을 관리할 수 있습니다.
[알고리즘]
1. 두 개의 heap을 선언합니다. left(max heap), right(min heap)
-> Python의 heap은 최소 힙이기 때문에 max heap으로 사용하려면 삽입하려는 수에 -를 붙이면 됩니다.
2. 두 개의 heap 크기가 같으면 left에 삽입합니다.
3. 두 개의 heap 크기가 다르면 right에 삽입합니다.
4. left max 값과 right min 값을 비교한 후 left max 값이 더 크면 right min값과 교체합니다.
5. left의 max값을 출력합니다.
[코드]
import sys
import heapq
if __name__ == "__main__":
n = int(sys.stdin.readline())
max_h, min_h = [], []
# max_h[0][1]값을 기준으로 큰 값은 min_h, 같거나 작은 값은 max_h에 삽입
for _ in range(n):
num = int(sys.stdin.readline())
if len(max_h) == len(min_h):
heapq.heappush(max_h, (-num, num))
else:
heapq.heappush(min_h, (num, num))
if len(max_h) >= 1 and len(min_h) >= 1 and max_h[0][1] > min_h[0][1]:
max_value = heapq.heappop(max_h)[1]
min_value = heapq.heappop(min_h)[1]
heapq.heappush(max_h, (-min_value, min_value))
heapq.heappush(min_h, (max_value, max_value))
print(max_h[0][1])
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[백준 1918] 후위 표기식 - Python (0) | 2020.12.29 |
---|---|
[백준 15922] 아우으 우아으이야!! - Python (0) | 2020.12.28 |
[백준 10836] 여왕벌 - Python (0) | 2020.12.11 |
[백준 1744] 수 묶기 - Python (0) | 2020.12.10 |
[백준 1111] IQ Test (2) | 2020.12.05 |