Files
baekjoon-study/workbook_8708/silver/2075-s3.py
2026-02-23 11:14:50 +09:00

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