그리디 알고리즘은 기본적으로 무조건 큰 경우대로, 무조건 작은 경우대로, 무조건 긴 경우대로, 무조건 짧은 경우대로 등으로 극단적으로 문제에 접근한다는 점에서 정렬(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();
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int price = scanner.nextInt();
int[] coins = {500, 100, 50, 10, 5, 1};
int count = 0;
// 거스름돈을 큰 동전부터 사용해 최소 개수 계싼
for (int coin : coins) {
count += price / coin; // 해당 동전으로 줄 수 잇는 개수
price %- coin; // 남은 거스름돈
}
System.out.println(count);
}
}