본문 바로가기
Problem Solving/Greedy

[그리디] 백준 1202번: 보석 도둑 / 골드2

by ggyongi 2021. 5. 31.
반응형

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 collections
import heapq
import sys
n, m = map(int, sys.stdin.readline().split())

jem = collections.defaultdict(list)
for i in range(n):
    w, v = list(map(int, sys.stdin.readline().split()))
    jem[w].append(-v)

back = []
for i in range(m):
    back.append(int(input()))
back.sort()

q = []
cur = 0
answer = 0
for i in range(m):
    charge = back[i]
    if cur <= charge:
        for k in range(cur, charge+1):
            for elem in jem[k]:
                heapq.heappush(q, elem)
    if q:
        val = heapq.heappop(q)*-1
        answer += val
    cur = charge+1

print(answer)

그리디 문제로, 

가방을 작은 순서대로 정렬한 뒤, 각 가방이 선택가능한 리스트 중

가장 비싼것을 택하는 방식으로 부분 최적해를 찾았다.

 

중요한건 구현방식으로, 자칫하다간 시간 초과가 발생하기 쉬워 까다롭다.

가장 비싼것을 택해서 리스트에서 빼내 줘야 하는데,

일반적인 방법으로는 매우 비효율적일 수밖에 없고, 여기서는 우선순위 큐를 활용해야 한다.

heapq를 이용하여 최대힙을 구현하였다.

 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글