문제)
N가지 화폐 종류가 주어진다. 이 화폐들을 사용해서 M원을 만들어야 한다. 이 때 최소한의 화폐 개수를 사용해서 M원을 만들어야 하며 화폐 구성은 같지만 순서가 다른 경우에는 같은 경우로 구분한다.
입력조건)
- 첫째 줄에 N, M이 주어진다. (1 <= N <= 100, 1 <= M <= 10,000)
- 이후 N개의 줄에는 각 화폐의 가치가 주어진다. 화폐 가치는 10,000보다 작거나 같은 자연수이다.
출력조건)
- 첫째 줄에 M원을 만들기 위한 최소한의 화폐 개수를 출력한다.
- 불가능할 때는 -1을 출력한다.
입력예시1)
2 15
2
3
출력예시1)
5
입력예시2)
3 4
3
5
7
출력예시2)
-1
풀이)
이 문제는 바텀업 방식을 통해서 반복문을 M 까지 돌면서 결과 리스트에 화폐 개수를 저장하는 방식으로 해결할 수 있다. 먼저 결과 리스트를 생성하고 무한대로 초기화 한다. 그리고 반복문을 1부터 M까지 돌면서 입력받은 화폐 종류에 대해서도 다시 반복문을 돌린다. 바깥쪽 반복문에 해당하는 인덱스를 i라고 하면 i원을 만들기 위해 결과 리스트의 [i - 화폐 종류]를 비교하여 최솟값을 산출하고 최솟값 + 1 을 인덱스 i에 저장하면 된다. 이 때 1을 더하는 이유는 해당 화폐 1개만 추가하면 i원을 만들 수 있기 때문이다.
i에서 입력 받은 화폐 종류를 뺄 때 0이 되는 경우에는 해당 화폐 1개만 사용하면 i원을 만들 수 있기 때문에 1이 저장되어야 한다. 따라서 결과 리스트의 0번째 인덱스에는 0을 저장하는 방식으로 조건문 없이 위의 최솟값 산출 과정에서 모두 해결 가능하다.
'Algorithm' 카테고리의 다른 글
다이나믹 프로그래밍 (Dynamic Programming) (4) - 실전문제 8.4) 바닥 공사 (0) | 2023.08.22 |
---|---|
다이나믹 프로그래밍 (Dynamic Programming) (3) - 실전문제 8.3) 개미 전사 (0) | 2023.08.22 |
다이나믹 프로그래밍 (Dynamic Programming) (2) - 실전문제 8.2) 1로 만들기 (0) | 2023.08.22 |
다이나믹 프로그래밍 (Dynamic Programming) (1) - 다이나믹 프로그래밍이란? (0) | 2023.08.21 |
이진 탐색 (Binary Search) (3) - 실전문제 7.3) 떡볶이 떡 만들기 (2) | 2023.08.05 |