DevYoon
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฝ๋ฉ ํ ์คํธ ๊ณต๋ถ (Python) ๋ณธ๋ฌธ
link ๐ https://school.programmers.co.kr/learn/courses/30/lessons/118668
๐ญ ์ฒ์์ BFS๋ก ์๋ํ์ผ๋, ๋ต์ด ์ ๋์ค์ง ์์๋ค.
๐ญ ๊ณ ๋ฏผํ๋ค๊ฐ ์นด์นด์ค์ ํด์ค์ ์ฐธ๊ณ ํ๊ณ , DP๋ก ํ์ด์ผ ์ ํ์ฑ๊ณผ ํจ์จ์ฑ ๋ชจ๋ ํต๊ณผํ ์ ์๋ ๋ฌธ์ ์์ ์ ์ ์์๋ค.
๐ญ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ๊ฐ์ฅ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์, ์ต๋ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ๋์ด์๋ ์ ๋๋ค๋ ๊ฒ! ์ด ๋ถ๋ถ์ ์ ์ํ์ง ๋ชปํด ์๊ฐ์ ์ข ํ๋นํ๋ค.
๐ญ DP ๋ฐฐ์ด์ 2์ฐจ์์ผ๋ก ์์ฑํ๊ณ , ๊ฐ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ ์กฐํฉ์ ๋ฌ์ฑํ๋ ๋ฐ์ ๋๋ ์ต๋จ ์๊ฐ์ ๊ธฐ๋กํด์ฃผ๋ ๊ฒ ํต์ฌ์ด์๋ ๊ฒ ๊ฐ๋ค.
def solution(alp, cop, problems):
# alp_req, cop_req, alp_rwd, cop_rwd, cost
answer = 0
max_alp = 0
max_cop = 0
# ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ต๋ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ
for pb in problems:
max_alp = max(pb[0], max_alp)
max_cop = max(pb[1], max_cop)
# ์ต๋ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ๋์ด๊ฐ๋ฉด ์ ๋จ
alp = min(alp, max_alp)
cop = min(cop, max_cop)
# dp ๋ฐฐ์ด ์์ฑ
dp = [[float('inf')]*(max_cop+1) for _ in range(max_alp+1)]
# ํ์ฌ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ => ์๊ฐ 0์ผ๋ก ์ด๊ธฐํ
dp[alp][cop] = 0
for y in range(alp, max_alp+1):
for x in range(cop, max_cop+1):
if y < max_alp:
# ์๊ณ ๋ ฅ 1์ ์ฌ๋ฆฌ๊ธฐ ์ํด 1์๊ฐ ๊ณต๋ถ
dp[y+1][x] = min(dp[y+1][x], dp[y][x]+1)
if x < max_cop:
# ์ฝ๋ฉ๋ ฅ 1์ ์ฌ๋ฆฌ๊ธฐ ์ํด 1์๊ฐ ๊ณต๋ถ
dp[y][x+1] = min(dp[y][x+1], dp[y][x]+1)
# ๋ฌธ์ ํ๋๋ฅผ ์ ํํ์ฌ ์๊ณ ๋ ฅ๊ณผ ์ฝ๋ฉ๋ ฅ์ ๋์
for alp_req, cop_req, alp_rwd, cop_rwd, cost in problems:
if y >= alp_req and x >= cop_req:
# ์ต๋ ์๊ณ ๋ ฅ๊ณผ ์ต๋ ์ฝ๋ฉ๋ ฅ์ ๋์ง ์์์ผ ํจ
new_alp = min(y+alp_rwd, max_alp)
new_cop = min(x+cop_rwd, max_cop)
dp[new_alp][new_cop] = min(dp[new_alp][new_cop], dp[y][x]+cost)
return dp[max_alp][max_cop]