diff --git a/workbook_8708/2075-s3.py b/workbook_8708/2075-s3.py new file mode 100644 index 0000000..97a6e31 --- /dev/null +++ b/workbook_8708/2075-s3.py @@ -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