알고리즘 풀이

less than 1 minute read

입출력

  • 입력
    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

  • 출력
    35

문제 설명

n*n 2차원 배열에 한 줄에 위에 숫자가 무조건 아래 숫자보다 작을 때 n번째 큰 수를 찾는다.

1차

소팅해서 N번째 값을 출력한다 - 메모리 초과

N = int(input())
numbers = []
for _ in range(N):
    numbers+=list(map(int, input().split()))
numbers.sort(reverse=True)
print(numbers[N-1])

메모리 초과라는 것은 메모리가 너무 많이 쓰인다는 것이니 모든 2차원 배열을 갖고 있지 않고 필요한 특정 갯수만 가질 수 있는 방법? 우선순위큐 -> 힙큐를 사용해보자!

힙큐는 N개를 유지하면서 제일 작은 것은 out시킬 수 있다.

2차

list로 먼저 input을 다 받아서 힙에 돌리는 것도 메모리 초과다. 그때 그때 한줄씩 받아서 힙에 돌리는게 최선인 것 같다..

import heapq

N = int(input())
heap = []
heapq.heapify(heap)
for first_line_number in list(map(int, input().split())):
    heapq.heappush(heap, first_line_number)

for _ in range(1, N):
    for line_number in list(map(int, input().split())):
        heapq.heappush(heap, line_number) 
        heapq.heappop(heap)

print(heapq.heappop(heap))