알고리즘

[백준] 2294 - 동전 2

bluealice 2025. 1. 5. 17:09

백준 2294번 동전 2

 

➡️문제 링크 : https://www.acmicpc.net/problem/2294

 

DP 에 관해 잘 알지 못하는 것 같아서 DP 문제 리스트를 풀던 중에 실버도 웬만큼 해봤다 싶어 골드에 도전해보기로 했다. 

k 만큼의 길이를 dp로 해서 dp[i] 는 i 만큼의 가격이 가질 수 있는 동전의 최소 개수를 의미하는 것으로 문제를 푸는 거라고 생각은 했지만 어떻게 '겹치는 소문제' 구조를 만들 수 있을지 생각하기 어려웠다. 

그래서 다른 블로그를 참고했고, 이전의 dp 값을 이용하는 것이 바로 이전의 값만 이용하지 않아도 점화식의 형태를 갖고 있으면 된다는 사실을 알 수 있었다. 사소한 발견이지만, dp에 대한 이해의 범위가 넓어졌다고 생각해 이렇게 블로그에 남기기로 했다.

 

➡️참고한 블로그 링크 : https://velog.io/@grace0st/%EB%8F%99%EC%A0%842-%EB%B0%B1%EC%A4%80-2294%EB%B2%88-%ED%8C%8C%EC%9D%B4%EC%8D%AC

 

동전2 (백준 2294번 파이썬)

dp를 이해했다 생각했는데 아니였나보다... 다시 이해하는 데 꽤 오래 걸렸당 흑흑 필요 요소 1\. 코인을 담을 1차원 배열 2\. 각 값마다 필요한 최소의 코인 갯수를 저장할 dp 배열로직 1\. 데이터들

velog.io

 

참고한 블로그 링크는 다음과 같으며, dp[0]을 0으로 초기화한 후, 값을 늘려가며 i를 정하고, coins를 순회하며 i-coin이 0보다 큰 값이라면 dp에 dp[i-coin]+1과 dp[i] 값을 비교하여 더 작은 값을 저장하는 방식으로 진행하였다. 

 

코드 

# DP
import sys

input = sys.stdin.readline

n,k=map(int,input().split(' '))

coins = [int(input()) for _ in range(n)]
inf=10**6
dp=[inf for _ in range(k+1)]
dp[0]=0

for i in range(1,k+1):
    for coin in coins:
        if i-coin>=0:
            dp[i]=min(dp[i],dp[i-coin]+1)

if dp[k]==inf:
    print(-1)
else:
    print(dp[k])

'알고리즘' 카테고리의 다른 글

[백준] 2564 - 경비원  (2) 2025.01.07
[백준] 1446 - 지름길  (3) 2025.01.06
[백준] 1802 - 종이 접기  (9) 2024.12.26
[백준] 1495 - 기타리스트  (3) 2024.12.24
[백준] 1474 - 밑 줄  (0) 2024.12.17