Coding Test
[Coding Test][Python][백준] BOJ #2075 N번째 큰 수
어떻게든 되겠지~
2025. 2. 21. 22:45
문제)
N×N의 표에 수 $N^2$개 채워져 있다. 채워진 수에는 한 가지 특징이 있는데, 모든 수는 자신의 한 칸 위에 있는 수보다 크다는 것이다. N=5일 때의 예를 보자.
12 | 7 | 9 | 15 | 5 |
13 | 8 | 11 | 19 | 6 |
21 | 10 | 26 | 31 | 16 |
48 | 14 | 28 | 35 | 25 |
52 | 20 | 32 | 41 | 49 |
이러한 표가 주어졌을 때, N번째 큰 수를 찾는 프로그램을 작성하시오. 표에 채워진 수는 모두 다르다.
입력)
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다.
다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
출력)
첫째 줄에 N번째 큰 수를 출력한다.
풀이)
※ 풀이 아이디어
$N \le1500$ 이므로 $N^2$의 Matrix는 $1500 \times 1500 \times 4 bytes = 9MB$의 메모리를 차지한다. 하지만 추가적인 오버헤드를 고려해보았을 떄 메모리 제한 12MB를 초과할 가능성이 있다.
따라서 다른 자료구조를 사용하거나, row별로 처리하는 알고리즘을 생각해야한다.
우리는 N번째 큰 수 만을 유지하면 되지 때문에 이를 Priority Queue를 통해 유지하면 된다.
입력을 Matrix에 저장하지 말고 한 줄씩 입력 받으면서 Min - Heap의 최소값보다 입력값이 크다면 Heap에 넣어준다.
이로써 모든 입력을 받으면 Top - N 개의 값을 유지하게 된다.
import heapq
N = int(input())
pq = []
heapq.heapify(pq)
for i in range(N):
row = list(map(int, input().split()))
for j in range(N):
if len(pq) < N:
heapq.heappush(pq, row[j])
elif len(pq) == N:
# 입력값 > Min heap의 최소값
if row[j] > pq[0]:
heapq.heappop(pq)
heapq.heappush(pq, row[j])
print(pq[0])
※ 메모리 초과 코드
처음에 단순하게 접근하여 Matrix를 입력받아 1차원 List로 만든 후 정렬하여 답을 구하였습니다.
하지만 메모리 초과를 마주하고 다른 방법을 통해 해결하였습니다.
(백준에서 시간초과가 나는건 많이 봤지만 메모리 초과는 한번도 보지 못해서 당황했다..!)
N = int(input())
# 메모리 초과
# 결국 2차원 Array를 사용하면 메모리 초과
# => 다른 자료구조를 사용해야한다.
matrix = [list(map(int, input().split())) for _ in range(N)]
# 메모리 초과
matrix = []
for _ in range(N):
matrix.extend(list(map(int, input().split())))
matrix.sort(reverse=True)
print(matrix[N-1])
반응형