https://www.acmicpc.net/problem/9084
https://www.acmicpc.net/problem/2293
# 동전으로 목표 금액을 만드는 경우의 수를 구하는 함수
def solve():
n = int(input()) # 동전 종류의 수
coinsType = list(map(int, input().split())) # 동전 종류
m = int(input()) # 목표 금액
# dp 배열 초기화: dp[i]는 금액 i를 만들 수 있는 경우의 수를 저장
dp = [0] * (m + 1)
dp[0] = 1 # 금액 0을 만들 수 있는 경우의 수는 1 (동전 하나도 사용하지 않는 경우)
# 각 동전을 사용하여 dp 배열 갱신
for coin in coinsType:
for i in range(coin, m + 1):
dp[i] += dp[i - coin]
# dp[m]에 목표 금액을 만들 수 있는 경우의 수가 저장됨
print(dp[m])
# 여러 테스트 케이스 처리
for _ in range(int(input())):
solve()
동전으로 주어진 금액을 만들 수 있는 방법을 세는 문제이다. 단순히 갯수에 따라 방법의 종류를 나누기 때문에 한 방법의 동전을 나열했을 때, 순서가 없다.
그렇기에 각 금액에 따라 현재의 금액을 구할 수 있다는 것을 알 수 있다. 현재의 dp[i]에는 dp[i-coin]을 더해온 값이 되는 것이다. 하지만 이 때, 문제가 있다. 현재의 금액을 기준으로 모든 동전의 종류를 따지면 전의 동전의 방법 뒤에 그 종류가 오는 것이기 때문에 순서가 생겨버린다. 우리는 순서가 필요하지 않다.
순서가 생기지 않기 위해서는 동전의 종류부터 따져야 한다. 즉, 1원으로 만드는 모든 방법을 구하는 것이다. 그 다음 2원으로 만드는 모든 방법을 그 방법위에 더하는 것이다. 그러면 오로지 동전의 각 종류에 따라서 방법의 결과가 누적되는 것이다. 순서가 없어지고 동전의 갯수의 증가폭에 따라 따져지는 것이다. 그렇기 때문에 작은 순으로 동전을 나열된 순으로 가져와 dp를 동전의 금액에 따라(금액의 증가폭) 갱신시켜주면 답이 나온다.
이렇게 Python으로 백준의 "동전" 문제를 해결해보았습니다. 코드와 개념 설명을 참고하여 문제를 해결하는 데 도움이 되셨길 바랍니다! 😊