문제
설명
다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환해주려면 어떻게 주면 되는가?
각 단위의 동전은 무한정 쓸 수 있다.
입력
첫 번째 줄에는 동전의 종류개수 N(1<=N<=50)이 주어진다.
두 번째 줄에는 N개의 동전의 종류가 주어지고, 그 다음줄에 거슬러 줄 금액 M(1<=M<=500)이 주어진다.
각 동전의 종류는 100원을 넘지 않는다.
출력
첫 번째 줄에 거슬러 줄 동전의 최소개수를 출력한다.
예시 입력 1
3
1 2 5
15
예시 출력 1
3
내 풀이
import java.util.Scanner;
public class Main10_5 {
public int Solution(int[] arr, int m){
int answer=0;
for (int i = arr.length-1; i >= 0; i--) {
if(m>0) {
answer += m/arr[i];
m = m%arr[i];
}
}
return answer;
}
public static void main(String[] args) {
Main10_5 T = new Main10_5();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int m = sc.nextInt();
System.out.println(T.Solution(arr, m));
}
}
DP를 사용하지 않고 풀어본 너무 단순한 방법인데
5
1 8 20 25 50
129
경우에 대해서 50X2 + 25X1 + 1X4 = 7개가 출력되는데
정답은 50X2 + 20X1 + 8X1 + 1X1 = 5개여서 안된다.
import java.util.Scanner;
public class Main10_5 {
static int[] dy;
static int n, m;
public int Solution(int[] arr){
int answer=Integer.MAX_VALUE, min=0;
int num;
dy[n-1] = m/arr[n-1];
m = m%arr[n-1];
num=m; //num:29고정
for (int i = n-2; i >= 0; i--) {
int tmp=num;
if(tmp>0){
dy[i] = tmp/arr[i];
tmp = tmp%arr[i];
}
for (int j = i-1; j >= 0; j--) {
if(tmp>0){
dy[j] = tmp/arr[j];
tmp = tmp%arr[j];
}
}
for(int x : dy) min += x;
answer = Math.max(answer, min);
dy[i]=0;
}
return answer;
}
public static void main(String[] args) {
Main10_5 T = new Main10_5();
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
dy = new int[n];
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
m = sc.nextInt();
System.out.println(T.Solution(arr));
}
}
그래서 dp를 적용하려고 해보았지만 대실패...ㅠㅠ
어려워어려워어어ㅓ려워ㅓㅓ
선생님 풀이
import java.util.Arrays;
import java.util.Scanner;
public class Main10_5 {
static int[] dy;
static int n, m;
public int Solution(int[] coin){
Arrays.fill(dy, Integer.MAX_VALUE);
dy[0] = 0;
for (int i = 0; i < n; i++) { //동전의 개수
for (int j = coin[i]; j <= m; j++) { //동전의 금액부터 거스를 금액까지 반복
dy[j] = Math.min(dy[j], dy[j-coin[i]]+1);
}
}
return dy[m];
}
public static void main(String[] args) {
Main10_5 T = new Main10_5();
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
m = sc.nextInt();
dy = new int[m+1];
System.out.println(T.Solution(arr));
}
}
dy[i] : i금액을 만드는 데 드는 최소 동전 개수
dy[j-coin[i]] + 1
coin 종류가 1 2 5가 있을 때 더 적은 값(최소 동전 개수)으로 업데이트 하는 코드
동전1로 2금액을 만드려면 1동전 2개가 필요하다 ==> dy[2] = 2
동전2로 2금액을 만드려면 2동전 1개만 있으면 된다 ==> dy[2] = 1
동전1로 3금액을 만드려면 1동전 3개가 필요하다 ==> dy[2] = 3
동전2로 3금액을 만드려면 2동전 2개만 있으면 된다 ==> dy[2] = 2
동전1로 각 금액을 만드는 데 드는 최소 동전 개수
dy 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
동전2로 각 금액을 만드는 데 드는 최소 동전 개수
dy 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8
동전5로 각 금액을 만드는 데 드는 최소 동전 개수
dy 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 1 2 2 1 2 2 3 3 2 3 3 4 4 3
결과