[Python] G2_1202_보석 도둑 πŸ’Ž

Sangho HanΒ·2023λ…„ 7μ›” 25일
post-thumbnail

https://www.acmicpc.net/problem/1202

문제

세계적인 도둑 μƒλ•μ΄λŠ” 보석점을 ν„ΈκΈ°λ‘œ κ²°μ‹¬ν–ˆλ‹€.

상덕이가 ν„Έ λ³΄μ„μ μ—λŠ” 보석이 총 N개 μžˆλ‹€. 각 보석은 무게 Mi와 가격 Viλ₯Ό κ°€μ§€κ³  μžˆλ‹€. μƒλ•μ΄λŠ” 가방을 K개 κ°€μ§€κ³  있고, 각 가방에 담을 수 μžˆλŠ” μ΅œλŒ€ λ¬΄κ²ŒλŠ” Ci이닀. κ°€λ°©μ—λŠ” μ΅œλŒ€ ν•œ 개의 λ³΄μ„λ§Œ 넣을 수 μžˆλ‹€.

상덕이가 ν›”μΉ  수 μžˆλŠ” λ³΄μ„μ˜ μ΅œλŒ€ 가격을 κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 Nκ³Ό Kκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≀ N, K ≀ 300,000)

λ‹€μŒ N개 μ€„μ—λŠ” 각 λ³΄μ„μ˜ 정보 Mi와 Viκ°€ μ£Όμ–΄μ§„λ‹€. (0 ≀ Mi, Vi ≀ 1,000,000)

λ‹€μŒ K개 μ€„μ—λŠ” 가방에 담을 수 μžˆλŠ” μ΅œλŒ€ 무게 Ciκ°€ μ£Όμ–΄μ§„λ‹€. (1 ≀ Ci ≀ 100,000,000)

λͺ¨λ“  μˆ«μžλŠ” μ–‘μ˜ μ •μˆ˜μ΄λ‹€.

좜λ ₯

첫째 쀄에 상덕이가 ν›”μΉ  수 μžˆλŠ” 보석 κ°€κ²©μ˜ ν•©μ˜ μ΅œλŒ“κ°’μ„ 좜λ ₯ν•œλ‹€.

예제


μ½”λ“œ

import sys,heapq
input = sys.stdin.readline

N,K = map(int,input().split()) # 보석, κ°€λ°©μ˜ 개수

# λ¦¬μŠ€νŠΈμ— 보석과 κ°€λ°© 정보λ₯Ό ν•¨κ»˜ μ €μž₯
lst = []
bag = 1000001 # κ°€λ°©μž„μ„ λ‚˜νƒ€λƒ„ (=λ³΄μ„μ˜ μ΅œλŒ€ κ°€μΉ˜λ³΄λ‹€ 컀야 λ™μΌν•œ λ¬΄κ²Œμ—μ„œ λ’€μͺ½μ— μœ„μΉ˜)
for _ in range(N):
    lst.append(list(map(int,input().split())))
for _ in range(K):
    lst.append([int(input()),bag]) 
# λ¬΄κ²Œκ°€ κ°€λ²Όμš΄ 순으둜 μ •λ ¬  
lst.sort()
# ν˜„μž¬ 가방에 λ“€μ–΄κ°ˆ 수 μžˆλŠ” κ°€μž₯ 높은 λ³΄μ„μ˜ κ°€μΉ˜κ°€ νž™ν 맨 μ•žμ— μœ„μΉ˜
hq = []
res = 0
for info in lst:
    if info[1] != bag:
        heapq.heappush(hq,-info[1])
    else:
        if hq:
            res += (-heapq.heappop(hq))
        
print(res)

이 λ¬Έμ œλŠ” κ°€μž₯ κ°€λ²Όμš΄ μš©λŸ‰μ˜ 가방에 κ°€μž₯ 큰 κ°€μΉ˜μ˜ 보석을 λ„£μ–΄μ£ΌλŠ” 것이 ν¬μΈνŠΈμ΄λ‹€!

  • 이λ₯Ό μœ„ν•΄μ„œ lst에 보석과 κ°€λ°© 정보λ₯Ό ν•¨κ»˜ μ €μž₯ν•΄μ€€λ‹€.

  • κ°€λ°©μž„μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ λ³€μˆ˜μΈ bag을 100001둜 μ„€μ •ν•΄μ€€λ‹€.

πŸ‘‰ 보석과 가방이 같은 무게일 λ•Œ, 가방이 보석보닀 뒀에 μœ„μΉ˜ν•˜λ„λ‘ λ³΄μ„μ˜ μ΅œλŒ€ κ°€μΉ˜λ³΄λ‹€ 크게 λ§Œλ“€μ–΄μ€€λ‹€.

λ¬΄κ²Œκ°€ κ°€λ²Όμš΄ 순으둜 μ •λ ¬ν•œλ‹€.

  • 이λ₯Ό ν†΅ν•΄μ„œ lstμ—λŠ” λ™μΌν•œ 무게의 보석, κ°€λ°© 정보가 μ°¨λ‘€λŒ€λ‘œ λ“€μ–΄μžˆκ²Œ λœλ‹€.

보석과 κ°€λ°© 정보λ₯Ό κ°€μ§€κ³  μ΅œμ’…μ μΈ μ΅œλŒ€ κ°€μΉ˜λ₯Ό ꡬ해쀀닀.

  • 보석일 경우, hq에 λ„£μ–΄μ€€λ‹€. μ΄λŠ” μ΅œλŒ€νž™μ΄κΈ° λ•Œλ¬Έμ—, κ°€μž₯ 큰 κ°€μΉ˜μ˜ 보석을 μš°μ„ μœΌλ‘œ 보여쀀닀.

  • 가방일 경우, hqμ—μ„œ κ°€μž₯ 큰 κ°€μΉ˜μ˜ 보석을 ν•˜λ‚˜ λΉΌμ„œ res에 κ°€μΉ˜λ₯Ό ν•©ν•΄μ€€λ‹€.


λŠλ‚€ 점 & 배운 점

  1. μ²˜μŒμ—λŠ” κ°€μž₯ μš©λŸ‰μ΄ κ°€λ²Όμš΄ 가방을 κ΅¬ν•˜κΈ° μœ„ν•΄μ„œ μ΅œμ†Œνž™μ„ μ“°κ³ , κ°€μž₯ κ°€μΉ˜κ°€ 큰 보석을 κ΅¬ν•˜κΈ° μœ„ν•΄μ„œ μ΅œλŒ€νž™μ„ μ‚¬μš©ν–ˆλ‹€. ν•˜μ§€λ§Œ μ΄λ ‡κ²Œ ν•˜λ‹ˆ 무게λ₯Ό 맞좜 μˆ˜κ°€ μ—†μ—ˆλ‹€.

  2. κ²°κ΅­ λ¦¬μŠ€νŠΈμ— ν•¨κ»˜ λ„£μ–΄μ£Όκ³  무게순으둜 μ •λ ¬ν•¨μœΌλ‘œμ¨, κ°€λ°© 정보가 λ‚˜μ™”μ„ λ•Œ μ΄μ „κΉŒμ§€μ˜ 보석을 무쑰건 넣을 수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ£ΌλŠ” 것이 μ€‘μš”ν•œ λ¬Έμ œμ˜€λ‹€!

  3. μ •λ ¬κ³Ό νž™ 큐λ₯Ό 적절히 μ‚¬μš©ν•  수 μžˆμ—ˆλ˜ 쒋은 λ¬Έμ œμ˜€λ‹€κ³  μƒκ°ν•œλ‹€.

profile
λΈ”λ‘œκ·Έ μ΄κ΄€ν•˜μ˜€μŠ΅λ‹ˆλ‹€: https://bbbang105.github.io/

0개의 λŒ“κΈ€