알고리즘 (Python)
동전 바꿔주기(DFS)
ppirae
2022. 4. 5. 22:41
인프런 김태원님의 파이썬 알고리즘 문제풀이를 듣고 작성한 글입니다.
파이썬 알고리즘 문제풀이 (코딩테스트 대비) - 인프런 | 강의
파이썬을 이용한 코딩테스트 문제풀이를 합니다., - 강의 소개 | 인프런...
www.inflearn.com
내 풀이 (정답 아님)
#내 풀이
def DFS(L, sum):
global cnt
if sum > T:
return
if sum == T:
cnt += 1
return
if L == k:
return
else:
for i in cn:
for j in range(i+1):
DFS(L+1, sum+cv[L])
DFS(L+1, sum)
if __name__ == "__main__":
cv = []
cn = []
T = int(input())
k = int(input())
for i in range(k):
a, b = map(int, input().split())
cv.append(a)
cn.append(b)
cnt = 0
DFS(0, 0)
print(cnt)
대충 가닥은 생각해서 진행했는데
답이 예상대로 나오지 않았다.
강의 풀이
#강의 풀이
def DFS(L, sum):
global cnt
if sum > T:
return
if L == k:
if sum == T:
cnt += 1
else:
for i in range(cn[L]+1):
DFS(L+1, sum+cv[L]*i)
if __name__ == "__main__":
T = int(input())
k = int(input())
cv = list()
cn = list()
for i in range(k):
a, b = map(int, input().split())
cv.append(a)
cn.append(b)
cnt = 0
DFS(0, 0)
print(cnt)
어디가 문제였냐면
동전의 개수만큼 반복해서 sum을 더하는 부분이 잘못되었다.
DFS를 동전의 개수만큼 재귀하는데
동전을 0개, 1개, 2개, ... 이런식으로 갈래를 나눠서
sum에 동전개수 i개를 곱해서 더해야한다.