56 lines
2.1 KiB
Python
56 lines
2.1 KiB
Python
# N번째 큰 수
|
|
|
|
import sys
|
|
import heapq
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
n = int(input().rstrip())
|
|
|
|
rank = list(map(int, input().rstrip().split()))
|
|
heapq.heapify(rank)
|
|
for _ in range(n-1):
|
|
nums = list(map(int, input().rstrip().split()))
|
|
for i in range(n):
|
|
heapq.heappush(rank, nums[i])
|
|
heapq.heappop(rank)
|
|
|
|
print(heapq.heappop(rank))
|
|
|
|
return
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 50분(메모리 때문에 고민 좀 했다.)
|
|
|
|
시간 복잡도: O(n^2logn) n^2개의 수를 읽을때마다 n개 길이의 힙에서 push와 pop을 하기 때문에 정렬 하는 것까지 logn해서 O(n^2logn)이다.
|
|
|
|
해설: 첫 번째 코드는 맨 마지막 행부터 n개중에 1등을 뽑고 1등이 나온 열에서 바로 한칸 위에 애를 데리고 또 n개중에 1등을 뽑고 총 n번을 진행하려고 했다.
|
|
그런데 결국 이게 O(n^2)이라는 것을 깨닫고 여기서 n개 중에 1등을 뽑는 방식을 줄이기 위해 heap을 생각해냈다. 그러면 1등 뽑을 때 O(logn)에 할 수 있다.
|
|
다른 문제가 하나 있는데 메모리 제한이 12MB라서 처음에 n^2개의 수들을 리스트에 저장하지 말고 한 줄씩 읽는대로 처리해야했다.
|
|
따라서 한 줄씩 heap에 넣으며 1등만 데리고 다음 줄로 넘어가서 확인하는 방식으로 하려고 했는데 이건 마지막 라인에서 경합 자격도 없는 애가 승부를
|
|
벌이게 되는 논리적 모순이 생기기 때문에 그냥 하나씩 계속 읽으면서 길이 n을 유지하는 최소 힙에 넣고 마지막에 heappop 하면 된다.
|
|
"""
|
|
|
|
# def solution():
|
|
# n = int(input().rstrip())
|
|
|
|
# nums = [[] for _ in range(n)]
|
|
# for _ in range(n):
|
|
# row = input().rstrip().split()
|
|
# for i in range(n):
|
|
# nums[i].append(int(row[i]))
|
|
|
|
# rank = [(-nums[i].pop(), i) for i in range(n)]
|
|
# heapq.heapify(rank)
|
|
|
|
# for i in range(n-1):
|
|
# _, nums_idx = heapq.heappop(rank)
|
|
# heapq.heappush(rank, (-nums[nums_idx].pop(), nums_idx))
|
|
|
|
# print(-heapq.heappop(rank)[0])
|
|
|
|
# return
|