Algorithm
[백준][2075][우선순위큐] N번째 큰 수 python (211030)
lluna
2021. 10. 31. 02:26
https://www.acmicpc.net/problem/2075
2075번: N번째 큰 수
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
www.acmicpc.net
이해도
★★☆☆☆
접근법
- 반복문 접근하면 메모리 초과가 나서 우선순위 큐를 구현해야 한다.
- 우선순위 큐는 힙으로 구현한다.
- 한 행씩 진행한다.
- 힙이 비어있다면 푸시하고, 비어있지 않은데 가장 작은 수보다 큰 수가 나오면 푸시하고, 추가된 힙에서 가장 작은 수를 pop 한다.
- 하나씩 추가했다 뺏다를 반복하므로 가장 큰 수부터 N개의 숫자가 힙에 담겨있다.
- 그 중 가장 작은 수를 출력한다.
왜 메모리 초과 문제가 발생하지 않는지?
- 우선순위 큐의 시간복잡도(힙의 데이터 삽입과 삭제)는 logN이다.
- 반복문의 경우 이중 for 문 뿐 아니라 배열을 전체순회하므로 우선순위 큐보다 시간복잡도가 높다.
import heapq
N = int(input())
heap = []
for _ in range(N):
nums = list(map(int, input().split()))
# 만약 heap 이 비어있다면 item을 heap으로 푸시한다.
if not heap:
for num in nums:
heapq.heappush(heap, num)
# heap 이 비어있지 않다면
else:
for num in nums:
# 만약 가장 작은 항목보다 큰 수가 나오면 해당 수를 푸시하고, 새로운 힙에서 가장 작은 수를 pop 한다.
if heap[0] < num:
heapq.heappush(heap, num)
heapq.heappop(heap)
# 반복을 마치면 큰 수부터 N개가 힙에 담겨 있으므로, 그 중 가장 작은 수를 반환한다.
print(heap[0])
코드 참고
[백준/2075번/파이썬(Python)] N번째 큰 수 / 우선순위 큐
문제 N×N의 표에 수 N2개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. N=5일 때의 예를 보자. 12 7 9 15 5 13 8 11 19 6 21 10 26 31 16 48 1..
kyoung-jnn.tistory.com
메모리 초과한 반복문
# 메모리 초과
N = int(input())
board = [list(map(int, input().split())) for x in range(N)]
maxnum = 0
for i in range(N):
for j in range(N):
maxnum = max(board[i][j], maxnum)
arr = []
for i in range(N - 1, -1, -1):
for j in range(N - 1, -1, -1):
arr.append(maxnum - board[i][j])
arr.sort()
print(maxnum - arr[N-1])