그리디 알고리즘은 기본적으로 무조건 큰 경우대로, 무조건 작은 경우대로, 무조건 긴 경우대로, 무조건 짧은 경우대로 등으로 극단적으로 문제에 접근한다는 점에서 정렬(Sort) 기법이 함께 사용되는 경우가 많다. 대표적인 예시로 크루스칼(Kruskal) 알고리즘으로 모든 간선을 정렬한 이후에 짧은 간선부터 연결하는 최소 비용 신장 트리 알고리즘이 있다.
우리가 흔히 거스름 돈을 줄 때 가장 적은 양의 화폘르 주는 것이 제일 편하다.
예를들어 1260원을 거슬러주어야 할 때, 500 * 2 + 100 * 2 + 50 * 1 + 10 * 1
으로 6개의 동전을 거슬러주면 된다.
이처럼 무조건 큰 화폐 단위를 거슬러 준다는 알고리즘만 지키면 최적의 해를 보장할 수 있다.
public class Main {
public static void main (String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int result = 0;
// 그리디 적용: 큰 단위의 동전부터 사용
result += n / 500;
n %= 500;
result += n / 100;
n %= 100;
result += n / 50;
n %= 50;
result += n / 10;
n %= 10;
System.out.println(result);
scanner.close();
}
}