그리디 감을 잡기 위해 한 블로그의 추천 리스트에 있는 문제를 풀어보았다. 링크를 첨부한다.
-욕심쟁이-알고리즘-개념
프로그래머스 문제만 풀다가 오랜만에 백준을 접하고 Scanner, 클래스를 작성하는 곳에서 오류가 더 많이 났다.
준규가 가지고 있는 동전은 총 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의 배수)
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
10 4200
1
5
10
50
100
500
1000
5000
10000
50000
6
이런 식으로 대게 잔돈을 얼마나 반환하는가의 로직과 비슷한 로직이 필요해 보였다.
로직을 구성하는 것보다. 아까 말한 외부적 문제에서 더 애를 먹었다.
코드의 구성은 크게
1. 변수설정
2. 반복문 연산
3. 출력
으로 나누어져있다.
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int K = in.nextInt();
int[] coins = new int[N];
for(int i=0; i<N;i++){
coins[i]= in.nextInt();
}
int min =0;
for(int i = N-1;i>=0;i--){
if(K-coins[i]>=0){
int coin = K/coins[i];
K-=coin*coins[i];
min+=coin;
}
}
System.out.println(min);
}
}