BAEKJOON Online Judge(BOJ) 문제입니다.
Baekjoon Online Judge
Baekjoon Online Judge 프로그래밍 문제를 풀고 온라인으로 채점받을 수 있는 곳입니다.
www.acmicpc.net
문제
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
내가 작성한 코드
import sys
from heapq import heappush, heappop
read = sys.stdin.readline
def read_data():
N, K = map(int, read().rstrip().split())
jewelry = []
packs = []
for _ in range(N):
heappush(jewelry, tuple(map(int, read().rstrip().split())))
for _ in range(K):
packs.append(int(read().rstrip()))
return jewelry, sorted(packs)
jewelry, packs = read_data()
answer = 0
pq = []
for pack in packs:
while jewelry and jewelry[0][0] <= pack:
m, v = heappop(jewelry)
heappush(pq, -v)
if pq:
answer += -heappop(pq)
print(answer)
- 우선순위 큐
- 무게가 작은 가방부터 탐색
- 무게가 작은 보석부터 탐색
- 현재 가방에 담을 수 있는 보석이면 최대힙에 push
- 더 이상 가방에 담을 수 있는 보석이 없으면 최대힙에서 최대값 answer 더하기
다른 사람이 작성한 코드
import heapq
import sys
N, K = map(int, sys.stdin.readline().split())
jewelryList = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
bagList = [int(sys.stdin.readline()) for _ in range(K)]
jewelryList.sort()
bagList.sort()
result = 0
temp = []
for bagWeight in bagList:
while jewelryList and bagWeight >= jewelryList[0][0]:
heapq.heappush(temp, -jewelryList[0][1]) # Max heap
heapq.heappop(jewelryList)
if temp:
result += heapq.heappop(temp)
elif not jewelryList:
break
print(-result)
- 아래 블로그에서 위 코드를 참고하여 작성함
[백준/1202번/파이썬(Python)] 보석 도둑 / 우선순위 큐
문제 세계적인 도둑 상덕이는 보석점을 털기로 결심했다. 상덕이가 털 보석점에는 보석이 총 N개 있다. 각 보석은 무게 Mi와 가격 Vi를 가지고 있다. 상덕이는 가방을 K개 가지고 있고, 각 가방에
kyoung-jnn.tistory.com
기억해야할 것
- 그리디 문제
- 그리디 문제 설계에 서툴은 것 같음
- 최대/최소 문제에서 우선순위 큐를 이용
'코딩테스트' 카테고리의 다른 글
[백준][그리디] 저울 (0) | 2022.04.17 |
---|---|
[백준][투포인터] 냅색문제 (0) | 2022.04.08 |
[백준][재귀] 감소하는 수 (0) | 2022.04.01 |
[백준][재귀] Choose Your Own Arithmetic (0) | 2022.04.01 |
[백준][슬라이딩윈도우] 달려라 홍준 (0) | 2022.03.29 |