문제 정보

풀이

전형적인 그리디 알고리즘 문제다.

동전의 단위가 배수 관계이기 때문에 항상 값이 큰 동전을 가능한 많이 쓰는 게 최적이다.1 예를 들어 10원 동전을 5원 동전으로 대체해봤자 개수만 늘어날 뿐이기 때문이다.

코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.StringTokenizer;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());
        
        int answer = 0;
        int[] tokens = new int[n];
        for (int i = 0; i < n; i++)
            tokens[i] = Integer.parseInt(br.readLine());
        
        for (int i = n - 1; i >= 0; i--) {
            int token = tokens[i];
            answer += k / token;
            k %= token;
            
            if (k == 0)
                break;
        }
        
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(answer+"\n");
        bw.flush();
        bw.close();
    }
}

Footnotes

  1. 만약 배수 관계가 아니라면 그리디로는 최적해를 보장할 수 없음. 이 경우 DP 사용.