초보 개발자의 일기
효율적인 화폐 구성 본문
728x90
문제
입력
- 첫째 줄에 N, M이 주어진다. (1 <=N <=100, 1 <=M <=10000)
- 이후 N개의 줄에는 각 화폐의 가치가 주어진다. 화폐 가치는 10000보다 작거나 같은 자연수이다.
출력
- 첫째 줄에 M원을 만들기 위한 최소한의 화폐 개수를 출력한다.
- 불가능할 때는 -1을 출력한다.
입력 예시
2 15
2
3
출력 예시
5
풀이 방법
못 풀어서 솔류션을 보았다 ㅜㅜ
내 코드
# 정수 N, M을 입력 받기
n, m = map(int, input().split())
# N개의 화폐 단위 정보를 입력 받기
array = []
for i in range(n):
array.append(int(input()))
# 한 번 계산된 결과를 저장하기 위한 DP 테이블 초기화
d=[0 for _ in range(n+1)]
# 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
for j in range(array[i], m + 1):
if d[j - array[i]] != 10001: # (i - k)원을 만드는 방법이 존재하는 경우
d[j] = min(d[j], d[j - array[i]] + 1)
# 계산된 결과 출력
if d[m] == 10001: # 최종적으로 M원을 만드는 방법이 없는 경우
print(-1)
else:
print(d[m])
Solution
# 정수 N, M을 입력 받기
n, m = map(int, input().split())
# N개의 화폐 단위 정보를 입력 받기
array = []
for i in range(n):
array.append(int(input()))
# 한 번 계산된 결과를 저장하기 위한 DP 테이블 초기화
d = [10001] * (m + 1)
# 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
for j in range(array[i], m + 1):
if d[j - array[i]] != 10001: # (i - k)원을 만드는 방법이 존재하는 경우
d[j] = min(d[j], d[j - array[i]] + 1)
# 계산된 결과 출력
if d[m] == 10001: # 최종적으로 M원을 만드는 방법이 없는 경우
print(-1)
else:
print(d[m])
느낀 점
동적프로그래밍 그림을 그려서 풀면 쉬울 줄 알았는데
뭐 이리 어렵냐 ㅜㅜ
728x90
'코딩테스트 > 이것이 코딩테스트다.(Python)' 카테고리의 다른 글
플로이드 워셜 알고리즘 (0) | 2022.07.31 |
---|---|
최단 경로 (다익스트라 알고리즘) (0) | 2022.07.25 |
바닥 공사 (0) | 2022.07.21 |
개미 전사 (2) | 2022.07.12 |
1로 만들기 (1) | 2022.07.10 |