알고리즘/코드트리 문제풀이

코드트리 [자바 java] 동전 거슬러주기

잔디🌿 2023. 8. 13. 21:12

https://www.codetree.ai/missions/2/problems/coin-change?utm_source=clipboard&utm_medium=text 

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

거슬러줄 금액과 동전의 종류가 나오면, 거슬러줄 수 있는 최소한의 동전 수를 출력하는 문제이다.

이 문제는 dp를 사용했다.

0부터 해당 금액까지의 dp배열을 선언하고, 사용할 수 있는 동전들을 하나 쓰는 방법을 모두 비교하여 최솟값을 넣도록 하였다.

 

import java.util.*;
import java.io.*;
import java.math.*;

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 m = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine());


        for(int i = 0;i<n;i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int[] dp = new int[m+1];

        for(int i = 1;i<=m;i++){
            int min = i;
            int ok = 0;

            for(int j = 0;j<n;j++){
                if((i - arr[j] > 0 && dp[i-arr[j]]!= 0) || i-arr[j] == 0){
                    ok = 1;
                    min = Math.min(min, dp[i-arr[j]]);
                }
            }

            if(ok == 1) dp[i] = min + 1;
            else dp[i] = 0;
            //System.out.println(dp[i]);
        }

        if(dp[m] != 0 )System.out.println(dp[m]);
        else System.out.println(-1);

        
    }
}