- 문제 : https://www.acmicpc.net/problem/2075
문제 이해
문제 자체를 이해하는 데는 그렇게 어렵지 않았다. 주어진 N^2개의 수 중에서 N번째 수를 구하면 된다.
그런데 N이 최대 1500이므로 N^2개의 원소를 하나의 배열에 모으고, 그걸 정렬하는데는 O(N^2)의 시간 복잡도가 발생한다. 그래서 다른 방법으로 진행해야하는데 이 때 힌트가 될만한 게, 하나의 열에서는 크기 순서대로 행이 정렬되었다는 것이다. 따라서 시간 복잡도 + 같은 열에서는 원소 오름차순 정렬 이라는 조건으로 heap을 사용해 문제를 해결할 수 있다.
여기에서 heap을 사용하는 대상이 주어진 배열이 아니라, heap이라는 새로운 배열을 heap으로 진행해야한다.
풀이 로직
- heap이라는 배열을 heap으로 적용하는데, heap 배열의 길이는 최대 N개가 될 수 있다.
- 먼저 주어진 값을 temp로 받은 뒤 각 temp의 각 원소(each)를 탐색하는데 len(heap)의 값에 따라 다르게 진행한다.
1. len(heap) < n 인 경우는 each를 heap에 그냥 넣는다.
2. len(heap) >= n 인 경우는 heap의 첫 번째 원소는 배열의 최솟값이므로 만약 each > heap[0] 이라면 heappop()을 한 뒤 each 값을 넣는다
- 반복문을 끝낸 뒤 heap에 남은 값들은 주어진 수를 정렬했을 때 heap[0] 값이 전체에서 n번째 수이므로 heap[0]을 출력한다.
정답풀이
import heapq
n = int(input())
heap = []
for _ in range(n):
temp = map(int, input().split())
for each in temp:
if len(heap) < n:
heapq.heappush(heap, each)
else:
if heap[0] < each:
heapq.heappop(heap)
heapq.heappush(heap, each)
print(heap[0])
참고 블로그
'백준 > Greedy' 카테고리의 다른 글
[heap/백준] 14235번 : 크리스마스 선물 (0) | 2023.07.18 |
---|---|
[heap/백준] 1417번 : 국회의원 선거 (0) | 2023.07.18 |
[그리디/백준] 14247번 : 나무 자르기 (0) | 2023.05.08 |
[그리디/백준] 2405번 : 세 수, 두 M (0) | 2023.05.08 |
[그리디/백준] 2812번 : 크게 만들기 (0) | 2022.07.17 |