💻 Algorithm/Greedy(그리디)

[JAVA] 백준 11047 - 동전 0

dlalwl_jpg 2024. 1. 22. 09:47

 

실버 IV

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net


📌 문제

준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.


💡 접근방식

동전의 가치가 큰 것부터 차례대로 K보다 작거나 같으면 K로 나눠 필요한 동전의 개수를 누적하여 count하였다. 잔돈은 K를 동전 가치로 나눈 나머지로 업데이트된다.


💻 코드

package Greedy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.Buffer;
import java.util.StringTokenizer;

public class SLIVER4_BJ11047 {
    /*
        https://www.acmicpc.net/problem/11047
        동전 0
     */
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        //N와 K입력
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());

        int[] coinValue = new int[N];

        //동전 가치 입력
        for(int i = 0; i < N; i++){
            coinValue[i] = Integer.parseInt(br.readLine());
        }

        int cnt = 0;
        for(int i = 0; i < N; i++){
            if(coinValue[N - 1 - i] <= K){
                cnt += K / coinValue[N - 1 - i]; //필요한 동전 개수 계산
                K = K % coinValue[N - 1 - i]; //잔돈 계산
            }
        }

        //결과 출력
        System.out.println(cnt);
    }
}

📝 NOTE

2 5
1
5

input = 1
error = 5

처음에 동전의 가치와 K가 같아도 count를 할 수 있다는 조건을 작성하지 않아 위 반례를 통해 코드를 수정하여 문제를 해결할 수 있었다.