폴더 분리
This commit is contained in:
55
workbook_8708/silver/2075-s3.py
Normal file
55
workbook_8708/silver/2075-s3.py
Normal file
@@ -0,0 +1,55 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user