import heapq
import sys
input = sys.stdin.readline
N = int(input())
arr = []
for _ in range(N):
temp = list(map(int,input().split()))
for number in temp:
heapq.heappush(arr,number)
while len(arr) > N:
heapq.heappop(arr)
result = heapq.heappop(arr)
print(result)
문제의 조건 중 N이 1500이라서 전부 arr에 저장을 하면 메모리가 부족할 가능성이 있다.
그래서 arr의 크기를 N으로 고정시켜놓고 그보다 클시에는 pop을 해주는 방식으로 했다.
import heapq
import sys
input = sys.stdin.readline
N = int(input())
arr = []
for i in range(N):
input_list = map(int,input().split())
if i == 0 :
for number in input_list:
heapq.heappush(arr,number)
else:
for number in input_list:
if number > arr[0]:
heapq.heappushpop(arr,number)
big_list = heapq.nlargest(N,arr)
print(big_list[N-1])
두번째 방식은 heapq의 기능을 좀 더 잘 쓰는것이다.
heappushpop을 하면 heapop을 하고 heappush를 하는 것보다 더 빠르다.
이걸 이용해서 위와 같이 똑같이 해주고,
마지막에는 전체 arr 중에서 N개의 큰 수 만을 뽑아내는 methods를 활용해준다.
# stkang9409 풀이 해석
def find_max_value(x):
return arr[max_row_list[x]][x]
import sys
input = sys.stdin.readline
N = int(input())
arr = [list(map(int,input().split())) for _ in range(N)]
max_row_list = [N-1]*N
# 각 열마다 가장 큰 값은 N-1번 행에 있는 값이다.
# 매번 돌면서 각 열마다 가장 큰값들을 비교해, 가장 큰 값이 있는 열의 index 값을 하나씩 줄여나간다.
# 그렇게 하면 마지막 N번째에 가장 큰 값을 가지는 열의 값이 N번째로 큰 수의 열값이 되고
# 그 때 저장된 위치의 값이 행이된다.
for cnt in range(N):
max_col_index = 0
for col in range(N):
max_col_index = max(col,max_col_index,key= find_max_value)
if cnt == N-1:
print(arr[max_row_list[max_col_index]][max_col_index])
max_row_list[max_col_index] -= 1
다른 분의 풀이를 해석한 것으로, 문제의 조건을 활용해서 하는 방식이다.
각 열의 값은 다음 행의 값보다는 작다는 점을 이용해,
N번을 반복하면서 가장 큰 값들이 위치한 col의 row값을 하나씩 줄여주는 방식이다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 14002 가장 긴 증가하는 부분 수열 4 (0) | 2021.04.08 |
---|---|
[BOJ/백준] 16235 나무 재테크 (0) | 2021.04.08 |
[BOJ/백준] 1300 K번째 수 (0) | 2021.04.08 |
[BOJ/백준] 1967 트리의 지름 (0) | 2021.04.08 |
[BOJ/백준] 1806 부분합 (0) | 2021.04.08 |