티스토리 뷰
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
문제
세계적인 도둑 상덕이는 보석점을 털기로 결심했다.
상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에 담을 수 있는 최대 무게는 Ci이다. 가방에는 최대 한 개의 보석만 넣을 수 있다.
상덕이가 훔칠 수 있는 보석의 최대 가격을 구하는 프로그램을 작성하시오.
코드
import sys
import heapq
n, k = map(int, sys.stdin.readline().split())
mv = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
k = [int(sys.stdin.readline()) for _ in range(k)]
mv.sort()
k.sort()
ans = 0
q = []
for i in k:
while mv and mv[0][0] <= i:
heapq.heappush(q, -heapq.heappop(mv)[1])
if q:
ans -= heapq.heappop(q)
sys.stdout.write(str(ans))
풀이
이 문제는 우선순위큐를 사용해 풀어야 시간초과가 나지 않을 가능성이 높다고 한다. 우선 heapq를 import해주고, q에다가 무게가 가장 적은 보석의 가격을 넣는다. pop을 하면 가장 작은 값을 우선적으로 가져올 수 있다.(파이썬에서의 heapq는 min heap) 가격 최대값을 구해야 하기 때문에 마이너스를 붙여 넣는다. 나중에 pop을 하면 가장 작은 숫자는 절대값이 가장 큰 음수가 될 것이다. 그리고 그 수를 ans에 빼주어 양수가 되게 한다.
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 12015 파이썬 - 가장 긴 증가하는 부분 수열 2 (0) | 2022.08.23 |
---|---|
백준 2109 파이썬 - 순회강연 (0) | 2022.08.14 |
백준 1285 파이썬 - 동전 뒤집기 (0) | 2022.06.29 |
백준 2138 파이썬 - 전구와 스위치 (0) | 2022.06.28 |
백준 1080 파이썬 - 행렬 (0) | 2022.06.28 |