공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 백준 1655. 가운데를 말해요

inspirit941 2020. 3. 13. 14:16
반응형

https://www.acmicpc.net/problem/1655

 

1655번: 가운데를 말해요

첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -10,000보다 크거나 같고, 10,000보다 작거나 같다.

www.acmicpc.net

접근 방법이 백준 키로거 문제와 흡사하다.

 

 

[Python] 백준 5397. 키로거

https://www.acmicpc.net/problem/5397 5397번: 키로거 문제 창영이는 강산이의 비밀번호를 훔치기 위해서 강산이가 사용하는 컴퓨터에 키로거를 설치했다. 며칠을 기다린 끝에 창영이는 강산이가 비밀번호 창에..

inspirit941.tistory.com

키로거에서는 왼쪽 / 오른쪽 커서값을 각각 stack 자료구로에 저장했다면,

여기서는 중앙값 기준으로 큰 값은 오른쪽, 작은 값은 왼쪽에 저장한다.

 

왼쪽 값은 max_heap로, 오른쪽 값은 min_heap로 구성하고, 중앙값은 항상 max_heap의 맨 첫번째 값이 되도록 구성한다.

 

1. 왼쪽과 오른쪽 원소의 길이가 같으면, 왼쪽에 새 값을 저장한다.

2. 만약 오른쪽 heap의 값보다 왼쪽 heap의 값이 더 크면, 오른쪽과 왼쪽의 원소값을 바꿔준다.

 

 

import heapq
import sys
# 중앙값 기준으로 작은 값 = left, 큰 값 = right
left, right = [], []
n = int(sys.stdin.readline())
for _ in range(n):
num = int(sys.stdin.readline())
if len(left) == len(right):
# max_heap.
heapq.heappush(left, (-num, num))
else:
# min_heap.
heapq.heappush(right, (num, num))
# 오른쪽 값에 원소가 있으면서,
# 왼쪽 값이 오른쪽 값보다 큰 경우... left원소보다 right원소가 더 커야 하는 조건에 위배
if right and left[0][1] > right[0][1]:
left_value = heapq.heappop(left)[1]
right_value = heapq.heappop(right)[1]
heapq.heappush(right, (left_value, left_value))
heapq.heappush(left, (-right_value, right_value))
print(left[0][1])
반응형