๋ฌธ์
https://www.acmicpc.net/problem/1202
๋ฌธ์ ์ง - BOJ ๊ธธ๋ผ์ก์ด ๋ฒ ํ (1)
์๊ณ ๋ฆฌ์ฆ: ๊ทธ๋ฆฌ๋ Greedy
ํ์ด
์๋์ด๊ฐ ํธ ๋ณด์์ ์๋ ๋ณด์์ด ์ด N๊ฐ ์๋ค. ๊ฐ ๋ณด์์ ๋ฌด๊ฒ Mi์ ๊ฐ๊ฒฉ Vi๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์๋์ด๋ ๊ฐ๋ฐฉ์ K๊ฐ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ ๊ฐ๋ฐฉ์ ๋ด์ ์ ์๋ ์ต๋ ๋ฌด๊ฒ๋ Ci์ด๋ค. ๊ฐ๋ฐฉ์๋ ์ต๋ ํ ๊ฐ์ ๋ณด์๋ง ๋ฃ์ ์ ์๋ค.
์๋์ด๊ฐ ํ์น ์ ์๋ ๋ณด์์ ์ต๋ ๊ฐ๊ฒฉ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๊ฐ ๊ฐ๋ฐฉ์ด K๊ฐ ์ฃผ์ด์ง๊ณ , ๊ฐ๋ฐฉ์ ๋ฐ๋ผ ๋ด์ ์ ์๋ ์ต๋๋ฌด๊ฒ๊ฐ์ด ๋ค๋ฅด๋ค.
๊ฐ๋ฐฉ ํ๋๋น ํ๋์ ๋ณด์๋ง ๋ฃ์ ์ ์๋ค.
๋ณด์์ ๋ฌด๊ฒ, ๊ฐ์น๋ก ์ฃผ์ด์ง๋ค.
๋๋ ๋ค๋ฅธ ํ์ด๋ค์ ์ฐธ๊ณ ํ์ฌ 3๊ฐ์ ํ์ ์ฌ์ฉํ๋ค.
๋จผ์ ํ1์๋ ์ฃผ์ด์ง ๋ณด์๋ค์ (๋ฌด๊ฒ, ๊ฐ์น)๋ก ์ ์ฅํ๋ค.
ํ2์๋ ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ฅผ ์ ์ฅํ๋ค.
ํ3์๋ ํ ๊ฐ๋ฐฉ์ ๋ฌด๊ฒ๋ณด๋ค ์ ๊ฑฐ๋ ๊ฐ์ ๋ณด์์ ๊ฐ์น๋ง ์ ์ฅํ๋ค.
๊ฐ ํ์ ์ด๋ฆ์
ํ1 = jewl
ํ2 = sack
ํ3 = taken_out
๋ผ๊ณ ํ์๋,
๊ฐ๋ฐฉ์ ๊ฐฏ์๋๋ก(K) ์ํํ๋ฉด์, ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ๊ฐ๋ฐฉ๋ถํฐ ๋ฌด๊ฑฐ์ด ๊ฐ๋ฐฉ๊น์ง ๊บผ๋ธ๋ค.
ํ์ฌ ๊ฐ๋ฐฉ์ s๋ผ๊ณ ํ์๋, 's์ ๋ฌด๊ฒ >= jewl์์ ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ๋ณด์์ ๋ฌด๊ฒ'๋ผ๋ฉด ๋ณด์์ ๊บผ๋ธ ๋ค ๊ฐ์น๋ฅผ taken_out์ ์ถ๊ฐํ๋ค.taken_out์ ์ต๋ํ์ผ๋ก ๊ตฌ์ฑํด์ผํ๋ฏ๋ก -๊ฐ์น๋ก ์ ์ฅํด์ผํ๋ค.
๋น๊ต๋ฅผ ๋ฐ๋ณตํ๋ฉฐ jewl์ ๋จ์์๋ ๋ณด์ ์ค s๋ณด๋ค ๊ฐ๊ฑฐ๋ ์ ๊ฒ ๋๊ฐ๋๊ฒ์ด ์๋ค๋ฉด ๋ฉ์ถ๋ค.
๊ทธ๋ผ s์ ๋ค์ด๊ฐ ์ ์๋ ๋ฌด๊ฒ์ ๋ณด์์ ๋ชจ๋ taken_out์ ๋ค์ด๊ฐ ์๋ ์ํ๊ฐ ๋๋ค.
๋ง์ง๋ง์ผ๋ก taken_out์ ๋ณด์๋ค ์ค ๊ฐ์ฅ ํฐ ๊ฐ์น๋ฅผ ์ง๋ ๋ณด์์ ๊บผ๋ด ๊ฒฐ๊ณผ๊ฐ์ ์ถ๊ฐํ๋ค.
์ต๋ํ์ด๋ฏ๋ก heappopํ์๋์ ๋ณด์์ด ๊ฐ์ฅ ํฐ ๊ฐ์น์ ๋ณด์์ด๋ค.
๋จ์์๋ taken_out์ ๋ณด์๋ค์ ์์ผ๋ก ๋์ฌ s๋ณด๋ค ๋ฌด์กฐ๊ฑด ์ ๊ฒ ๋๊ฐ๋ฏ๋ก, taken_out์์ ๊บผ๋ธ ๋ณด์๋ค์ ๋ฌด์กฐ๊ฑด ํ์ฌ s์ ๋ค์ด๊ฐ ์ ์๋ ๋ณด์๋ค์ธ์
์ด๋ค.
๊ฐ๋ฐฉ์ ๋ชจ๋ ์ฌ์ฉํ ๋๊น์ง ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฐ์ดํธํ๋ค.
์ ์ฒด ์ฝ๋
from sys import stdin
from heapq import heappop, heappush
input = stdin.readline
N, K = map(int, input().split())
jewl = []
for _ in range(N):
heappush(jewl, tuple(map(int, input().split())))
sack = []
for _ in range(K):
heappush(sack, int(input()))
taken_out = []
ret = 0
for _ in range(K):
s = heappop(sack)
# (ํ์ฌ ๊ฐ๋ฐฉ s >= ๊ฐ์ฅ ๊ฐ๋ฒผ์ด ๋ณด์์ ๋ฌด๊ฒ) ๋ผ๋ฉด, taken_out์ -(๋ณด์์ ๊ฐ์น)๋ฅผ ๋ฃ๋๋ค.
while jewl and s >= jewl[0][0]:
_, v = heappop(jewl)
heappush(taken_out, -v)
# taken_out์ ๋ณด์์ด ์กด์ฌํ๋ค๋ฉด ์ ์ผ ๊ฐ์น๊ฐ ๋์ ๋ณด์์ ๋นผ์ ret์ ์ถ๊ฐํ๋ค.
if taken_out:
ret -= heappop(taken_out)
print(ret)
# ๊ฐ์ฅ ์์ ๊ฐ๋ฐฉ๋ถํฐ ํฐ ๊ฐ๋ฐฉ ์์ผ๋ก ์ํํ๊ธฐ ๋๋ฌธ์, ํ์ฌ ํด์ s๋ taken_out์ ์กด์ฌํ๋ ๋ณด์์ 100% ๋ฃ์ ์ ์๋ค.
# ๋์
๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ํ์ด๋ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋๋ฌด ์ปค์ง๊ฒ๋๋ค.
๋จธ๋ฆฟ์์ด ์คํ๊ฒํฐ ์ฝ๋ํ๐๋ ๋์ ๋๋ ค๋ณด๋ฉด์ ํธ๋๊ฒ ๋์๊ฒ๊ฐ๋ค.