https://www.acmicpc.net/problem/1655
1655번: 가운데를 말해요
첫째 줄에는 백준이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 백준이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
⭐ 문제
백준이가 동생에게 1, 5, 2, 10, -99, 7, 5를 순서대로 외쳤다고 하면, 동생은 1, 1, 2, 2, 2, 2, 5를 차례대로 말해야 한다. 백준이가 외치는 수가 주어졌을 때, 동생이 말해야 하는 수를 구하는 프로그램을 작성하시오.
⭐ 코드 분석
- 두개의 heap 필요
1. left heap : 최대 heap
2. right heap : 최소 heap
➡ 왼쪽 힙의 첫번째 요소는 항상 중앙값이 된다
1. 왼쪽 힙과 오른쪽 힙의 길이가 같으면 (요소 * -1) 을 왼쪽 힙에 삽입한다.
1-1. 그렇지 않으면 오른쪽 힙에 삽입한다.
2. 왼쪽 힙과 오른쪽 힙에 요소가 존재하고, 왼쪽 힙의 (첫번째 요소* -1) 가 오른쪽 첫번째 요소보다 클 때
2-1. 왼쪽 힙의 첫번째 요소와 오른쪽 힙의 첫번째 요소를 바꿔준다. ( -1을 곱해준 뒤 바꿔준다. )
3. 왼쪽 힙의 (첫번째 요소 * -1)를 출력한다.
ex) [1, 5, 2, 10, -99, 7, 5]
num = 1 👉🏻 left = [-1] / right = []
num = 5 👉🏻 left = [-1], right = [5]
num = 2 👉🏻 left = [-2,-1], right = [5]
num = 10 👉🏻 left = [-2,-1], right = [5,10]
num = -99 👉🏻 left = [-2,-1,99], right = [5,10]
num = 7 👉🏻 left = [-2,-1,99], right = [5,7,10]
num = 5 👉🏻 left = [-5,-2,-1,99], right = [5,7,10]
# 파이썬 코드 작성시 input()은 시간 초과 발생하므로 sys.stdin.readline() 이용 필수
⭐ 코드
import sys
import heapq
input = sys.stdin.readline
n = int(input())
max_h, min_h = [], []
for i in range(n):
num = int(input())
if len(max_h) == len(min_h):
heapq.heappush(max_h, -num)
else:
heapq.heappush(min_h, num)
if len(max_h) >= 1 and len(min_h) >= 1 and max_h[0] * -1 > min_h[0]:
max_value = heapq.heappop(max_h) * -1
min_value = heapq.heappop(min_h)
heapq.heappush(max_h, min_value * -1)
heapq.heappush(min_h, max_value)
print(max_h[0] * -1)
[ BOJ 1655 ] 가운데를 말해요(Python)
https://www.acmicpc.net/problem/1655아주 그냥 요상한 게임은 다 한다.정수가 하나씩 추가될 때마다, 지금까지 추가된 수를 정렬한 뒤 가운데에 있는 수를 출력하면 된다.오답힙으로 입력을 받아서 자동
velog.io
'Python > 백준' 카테고리의 다른 글
[python/백준] 10830번: 행렬 제곱 (0) | 2023.11.14 |
---|---|
[python/백준] 11401번 : 이항 계수 3 (0) | 2023.11.13 |
[python/백준] 12865번: 평범한 배낭 (0) | 2023.11.06 |
[python/백준] 7570번: 줄 세우기 (0) | 2023.11.05 |
[python/백준] 1700번: 멀티탭 스케줄링 (0) | 2023.11.03 |