https://www.acmicpc.net/problem/1655
1655번: 가운데를 말해요
첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
리스트 정렬(sort)해서 가운데 값 return 하는 방식으로는 시간 초과
heap 자료구조 방식 활용
Solution
import heapq
import sys
input = sys.stdin.readline
n = int(input())
l_heap = []
r_heap = []
for _ in range(n) :
num = int(input())
if len(l_heap) == len(r_heap):
heapq.heappush(l_heap,-num)
else:
heapq.heappush(r_heap,num)
if len(l_heap)>=1 and len(r_heap)>=1 and l_heap[0]*(-1)>r_heap[0]:
max_num = heapq.heappop(l_heap)*(-1)
min_num = heapq.heappop(r_heap)
heapq.heappush(l_heap, min_num*(-1))
heapq.heappush(r_heap, max_num)
print(l_heap[0]*(-1))
# print('left : ', leftHeap, '/', 'right :', rightHeap)
(1) 양쪽 heap 개수 동일하면, Left heap 에 (-)형태로 넣는다
(2) 동일하지 않는 경우, Right heap 으로
(3) 만약 Left heap 제일 큰 수가 Right heap 제일 작은 수 보다 클 경우,
Left heap 에서 빼서 (-1) 곱해준 후, Right heap 으로
Right heap 에서도 제일 작은 값 빼서 (-1) 곱해준 후, Left heap으로 넣는다.
(4) 마지막으로, Left heap에서 제일 큰 수 출력
짝수 개수일 때나 홀수 개수일 때도, Left heap에 포함되어 있는 수 출력하기 때문에.
'Programming > Etc' 카테고리의 다른 글
Programmers / hash / 위장 (0) | 2022.04.28 |
---|---|
소수 찾기 효율성 (0) | 2022.02.15 |
Programmers / 문자열 압축 (0) | 2022.02.11 |
Hackerrank / Write a function (0) | 2022.01.18 |
Hackerrank / Iterables and Iterators (0) | 2021.12.03 |