1. 문제
1655번: 가운데를 말해요
첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
2. 접근 방법
인풋을 받으면서 가운데를 확인하면 백퍼 시간초과 각이었고
접근 방법이 생각나지 않아 검색을 했다.
이 문제는 최대힙과 최소힙을 사용해서 풀어야하는 문제였다.
1. 최소 힙의 값들은 모두 최대 힙보다 크도록 하고
2. 최대 힙의 크기가 최소 힙의 크기보다 1 크거나 같도록 유지하며 값을 넣는다.
3. 값을 넣어준 후 최대 힙과 최소 힙의 top값을 비교해서 최소 힙의 top보다 최대 힙의 top이 더 크면 값을 교환해준다.
4. 최대 힙의 top값이 중간 값이된다.
3. 코드
python
import heapq, sys
N = int(input())
max_lst = []
min_lst = []
for i in range(N):
n = int(sys.stdin.readline())
if len(max_lst)-len(min_lst) <= 0:
heapq.heappush(max_lst, (-n, n))
else:
heapq.heappush(min_lst, n)
if max_lst and min_lst and max_lst[0][1] > min_lst[0]:
maxtomin = heapq.heappop(max_lst)[1]
mintomax = heapq.heappop(min_lst)
heapq.heappush(min_lst, maxtomin)
heapq.heappush(max_lst, (-mintomax, mintomax))
print(max_lst[0][1])
4. 마치며
여기를 참고해서 풀었다.
[BOJ] 1655. 가운데를 말해요
https://www.acmicpc.net/problem/1655 1655번: 가운데를 말해요 첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수
regularmember.tistory.com
그리고 힙 관련 문제는 왜 다들 input()하면 시간초과가 뜨는지 ㅠ
얘도 앞서 풀었던 최소 힙, 최대 힙, 절댓값 힙과 마찬가지로 sys.stdin.readline()으로 입력을 받아줬따.
'Algorithm > Python' 카테고리의 다른 글
[swea 5656] 벽돌깨기 (0) | 2021.04.23 |
---|---|
[swea 5658] 보물상자 비밀번호 (0) | 2021.04.23 |
[백준 11286] 절댓값 힙 (0) | 2021.04.23 |
[백준 11279] 최대 힙 (0) | 2021.04.23 |
[백준 1927] 최소 힙 (0) | 2021.04.22 |