N×N의 표에 수 N2개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. N=5일 때의 예를 보자.
12 7 9 15 5
13 8 11 19 6
21 10 26 31 16
48 14 28 35 25
52 20 32 41 49
이러한 표가 주어졌을 때, N번째 큰 수를 찾는 프로그램을 작성하시오. 표에 채워진 수는 모두 다르다.
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
첫째 줄에 N번째 큰 수를 출력한다.
sol1)
import heapq
heap = []
n = int(input())
len(heap)
for _ in range(n):
numbers = map(int, input().split())
for number in numbers:
if len(heap) < n: # heap의 크기를 n개로 유지
heapq.heappush(heap, number)
else:
if heap[0] < number: # (number가 minheap보다 클 경우) heap정렬을 유지한 채로 교체
heapq.heappop(heap)
heapq.heappush(heap, number)
print(number, heap)
#else : (number가 minheap보다 작을 경우) 아무 교체도 안일어남
print(heap[0])
sol2)
import heapq
n = int(input())
heap = []
for i in range(n):
for j in list(map(int, input().split())):
heapq.heappush(heap, j) # j를 그대로 힙에 추가
if len(heap) > n: # 힙의 크기가 n을 초과하면 가장 작은 원소 제거
heapq.heappop(heap)
print(heap[0]) # 힙의 가장 큰 원소가 결과
import heapq
n = int(input())
heap = []
for i in range(n):
for j in list(map(int, input().split())):
heapq.heappush(heap, -j)
print(heap)
print((-1)* heap[n-1])
[0]값
(가장 작은 값) 과 입력값을 비교하며 입력값을 힙에 넣으면 된다.[0]값
과 새로운 원소(number)를 비교하여 새로운 원소가 클 경우 pop후 새로운 원소(number)를 넣는다. 작을 경우에는 무시한다.for _ in range(n):
numbers = map(int, input().split())
for number in numbers:
if len(heap) < n: # heap의 크기를 n개로 유지
heapq.heappush(heap, number)
print(number, heap)
else:
if heap[0] < number: # (number가 minheap보다 클 경우) heap정렬을 유지한 채로 교체
heapq.heappop(heap)
heapq.heappush(heap, number)
print(number, heap)
#else : (number가 minheap보다 작을 경우) 아무 교체도 안일어남
사진은 for문이 진행될 떄 마다 print문을 넣어 어떻게 heap이 작동되는지 볼 수 있다.
출력초과가 뜨지 않는 것을 확인할 수 있다.
확실히 자료구조에 대한 절대적인 공부량의 부족으로 heap을 사용하며 애를 먹었다. 본질은 자료구조 알고리즘이다. 알고리즘 수업시간때 집중해서 듣고 복습을 철저히 해야겠다.