
최적 부분 구조 : 부분 문제의 최적해가 전체 문제의 최적해로 이어질 수 있는 구조.
탐욕적 선택 속성 : 각 단계에서의 최적 선택이 전체 문제에서도 최적이라는 속성.
-즉 앞의 선택이 이후의 선택에 영향을 주지 않는다.

서울에서 부산으로 최소거리로 간다고 가정하자.
서울에서 대구가는 선택이 대구에서 부산으로 가는 선택에 의해 결정이 되지는 않는다. // 서울 -> 대구 200km , 대구 -> 부산 80km 를 선택하면 된다.
즉 이 문제의 해결 방법은 부분 문제의 최적 해결 방법으로 연결이 된다.
문제 해결
import java.util.Arrays;
public class CoinChange {
public static int minCoins(int[] coins, int amount) {
// 동전 배열을 내림차순으로 정렬
Arrays.sort(coins);
reverse(coins);
int count = 0; // 사용된 동전의 개수
int remainingAmount = amount; // 남은 금액
// 가장 큰 단위의 동전부터 사용
for (int coin : coins) {
if (remainingAmount >= coin) {
count += remainingAmount / coin; // 해당 동전의 개수를 더함
remainingAmount %= coin; // 남은 금액 갱신
}
}
// 남은 금액이 0이면 모든 금액을 동전으로 채운 것이므로 count 반환
// 그렇지 않으면 -1 반환
return remainingAmount == 0 ? count : -1;
}
// 배열을 내림차순으로 정렬하는 유틸리티 메서드
private static void reverse(int[] array) {
int left = 0, right = array.length - 1;
while (left < right) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
left++;
right--;
}
}
// 테스트 케이스
public static void main(String[] args) {
int[] coins = {1, 5, 10, 25};
int amount = 63;
int result = minCoins(coins, amount);
if (result != -1) {
System.out.println("최소 동전 개수: " + result);
} else {
System.out.println("해당 금액을 만들 수 없습니다.");
}
}
}