그리디알고리즘(Greedy Algorithm)
그리디(Greedy)란 '탐욕스러운, 욕심 많은' 이란 뜻이다.
그리디 알고리즘은 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에 도달하는 방식이다.
하지만 순간의 최적의 선택을 한다고 해서 최종적인 해답이 최적이라는 보장이 없다.
따라서 그리디 알고리즘을 적용할 수 있는 문제들은 지역적으로 최적이면서 전역적으로도 최적인 문제들일때 그리디 알고리즘을 적용할 수 있다.
여기서 가장 중요한 점은 그리디 알고리즘을 이용하면 최적해를 찾지 못할 수 도 있다는 것을 항상 명심해야한다.
그렇다면 그리디 알고리즘을 적용하여 최적해를 구할 수 있는 문제는 어떤 조건을 만족할까?
1. greedy choice property : 현재 선택이 이 후의 선택에 영향을 주지 않는다.
2. optimal substructure : 매 순간의 최적의 해가 문제 전체에 대한 최적의 해여야 함
하지만 위 조건이 만족하지 않아도 그리디 알고리즘을 근사 알고리즘으로 사용하는 경우가 있다.
그리디 알고리즘은 계산 속도가 매우 빠른 알고리즘 중 하나이므로 물론 지역적으로 최적의 선택을 반복하기 때문에 전체적인 최적해를 보장하지는 못하더라도 어느 정도까지 최적에 가까운 해를 구할 수는 있다. 이렇든 어느 정도 적합한 수준의 해답을 알려주기 때문에 근사 알고리즘으로 그리디 알고리즘을 사용하는 경우가 있다.
문제
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int K = sc.nextInt();
int[] arr = new int[N];
for(int i=0; i<N; i++) {
arr[i] = sc.nextInt();
}
int count = 0;
for(int i=N-1; i>=0; i--) {
if(arr[i] <= K) {
count = count + (K / arr[i]);
K = K % arr[i];
}
}
System.out.println(count);
}
}
'알고리즘 정리' 카테고리의 다른 글
[백트래킹] 백트래킹의 설명과 간단한 예제풀이 (0) | 2022.09.19 |
---|---|
[BFS] BFS의 설명과 간단한 예제풀이 (1) | 2022.09.19 |
[DFS] DFS의 설명과 간단한 예제풀이 (1) | 2022.09.19 |
[브루트 포스] 브루트 포스의 설명과 간단한 코테 예제풀이 (1) | 2022.09.14 |