https://www.acmicpc.net/problem/1202
1202번: 보석 도둑
첫째 줄에 N과 K가 주어진다. (1 ≤ N, K ≤ 300,000) 다음 N개 줄에는 각 보석의 정보 Mi와 Vi가 주어진다. (0 ≤ Mi, Vi ≤ 1,000,000) 다음 K개 줄에는 가방에 담을 수 있는 최대 무게 Ci가 주어진다. (1 ≤ Ci
www.acmicpc.net
백준 - 보석 도둑 (LOPOV) (1202번)
난이도 : Gold 2
알고리즘 : Priority Queue & Sorting
풀이 소요 시간 : 90분
Time Complexity : O( O(N * log(N) )
import sys
input = sys.stdin.readline
from heapq import heappush, heappop
if __name__ == '__main__':
N, K = map(int, input().split())
js = []
for _ in range(N):
m, v = map(int, input().split())
js.append((-v, m))
js.sort(key=lambda x: -x[1])
total = 0
pq = []
for c in sorted(int(input()) for _ in range(K)):
while js and js[-1][1] <= c:
heappush(pq, js.pop())
if pq:
v, _ = heappop(pq)
total -= v
print(total)
가방들을 용량 순서대로 정렬하고,
보석들은 무게 순서대로 정렬해서
가방을 하나씩 살펴보면서
현재 가방 용량보다 작거나 같은 무게의 보석들을
보석 가치 기준으로 Priority Queue에 넣어둔다.
그리고 가장 가치가 높은 보석 하나를 Priority Queue에서 꺼내면,
그 보석이 현재 가방에 넣을 보석이다.
아이디어 떠올리기는 어렵지만,
방법만 알면 구현 자체는 쉬운 문제.
앞으로 비슷한 유형의 문제를 풀 때
많은 힌트를 얻을 수 있는 좋은 문제였다.
'Algorithm' 카테고리의 다른 글
택배 (8980번) - 백준 (BOJ) (0) | 2023.05.10 |
---|---|
트리 복구 (6597번) - 백준 (BOJ) (0) | 2023.05.05 |
내리막 길 (1520번) - 백준 (BOJ) (0) | 2023.05.01 |
거짓말 (1043번) - 백준 (BOJ) (0) | 2023.04.30 |
마법사 상어와 토네이도 (20057번) - 백준 (BOJ) (0) | 2023.04.30 |