
반응형
문제
https://www.acmicpc.net/problem/2075
2075번: N번째 큰 수
첫째 줄에 N(1 ≤ N ≤ 1,500)이 주어진다. 다음 N개의 줄에는 각 줄마다 N개의 수가 주어진다. 표에 적힌 수는 -10억보다 크거나 같고, 10억보다 작거나 같은 정수이다.
www.acmicpc.net
풀이
해당 문제는 N의 최대 크기가 1500으로 시간 제한만 고려한다면 입력되는 숫자 모두를 받아서 정렬하는 방식을 사용해도 풀이가 가능합니다. 하지만 메모리 제한으로 인해 위와 같은 풀이를 제출 시 메모리 초과가 납니다.
따라서 N^2 개의 숫자 모두를 배열에 저장하고 그 후에 문제 조건에 따라 무언가를 처리하는 방식으로는 해당 문제를 풀기 어렵습니다.
이에 N^2의 숫자들을 모두 살펴보면서 로직을 수행하되 이러한 입력들을 크기가 N 짜리 우선순위 큐에서 처리해주면 문제를 해결할 수 있습니다.
주요 로직은 아래와 같습니다.
현재 확인하고 있는 숫자에 대해서,, ( N^2의 숫자를 하나하나 확인함)
1. 우선순위 큐 안에 들어있는 원소의 개수가 N개 미만이라면
➜ 우선순위 큐에 집어넣는다.
2. 우선순위 큐 안에 들어있는 원소의 개수가 N개라면
1) 현재 확인하고 있는 숫자가 우선순위 큐의 최솟값보다 작은 경우
➜ 무시한다.
2) 그 외의 경우
➜ 우선순위 큐의 최솟값을 제거하고 현재 확인하고 있는 숫자를 우선순위 큐에 삽입한다.
풀이 코드는 아래와 같습니다.
import heapq
heap = []
n = int(input())
for _ in range(n):
numbers = map(int, input().split())
for number in numbers:
if len(heap) < n: # heap의 크기를 n개로 유지
heapq.heappush(heap, number)
else:
if heap[0] < number:
heapq.heappop(heap)
heapq.heappush(heap, number)
print(heap[0])
'Algorithm > 백준' 카테고리의 다른 글
[BOJ] 14889 스타트와 링크 - Python (0) | 2022.01.02 |
---|---|
[BOJ] 1655 가운데를 말해요 - Python (0) | 2021.12.05 |
[BOJ] 1927 최소힙, 11279 최대힙 - Python (0) | 2021.12.02 |
[BOJ] 22781 징검다리 건너기 - Python (9) | 2021.11.20 |
[BOJ] 백준 20444: 색종이와 가위 - Python (0) | 2021.11.19 |