반응형
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의 값이 더 크면, 오른쪽과 왼쪽의 원소값을 바꿔준다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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]) | |
반응형
'프로그래밍 > 코딩테스트 문제풀이' 카테고리의 다른 글
[Python] 구름. 외주 (0) | 2020.03.17 |
---|---|
[Python] 백준 1005. ACM Craft (0) | 2020.03.14 |
[Python] Hackerrank. Climbing the Leaderboard (Medium) (0) | 2020.03.12 |
[Python] Hackerrank. Sherlock and the Valid String (Medium) (0) | 2020.03.11 |
[Python] Hackerrank. Big Sorting (Easy) (0) | 2020.03.10 |