알고리즘

백준 14916번 거스름돈 (JAVA)

박카스마시며코딩 2022. 3. 18. 15:56

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

 

14916번: 거스름돈

첫째 줄에 거스름돈 액수 n(1 ≤ n ≤ 100,000)이 주어진다.

www.acmicpc.net

 

저는 해당 문제를 DP를 이용하여 문제를 해결하였습니다. 

처음에는 break를 사용하지 않아 시간이 2초가 살짝 넘었습니다.

돈을 5원짜리 먼저 그리고 for문도 제일 큰 값에서 줄여나가는 식으로 하여 가장 먼저 값을 찾을 때가 제일 동전의 개수가 적기 때문에 INF가 아니면 바로 break를 해 1초 안에 돌아가도록 하였습니다.

 

 

package BOJ.DP;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.function.Function;

public class BOJ_14916 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(br.readLine());
        int[] dp = new int[n+1];
        int result = dfs(0,n,dp);
        if(result == INF){
            System.out.println(-1);
        }else{
            System.out.println(result);
        }
    }
    private static int[] money = {5,2};
    private static final int INF = 987654321;
    private static int dfs(int depth, int n, int[] dp) {
        if(dp[n] != 0){
            return dp[n];
        }
        if(depth == 2 && n != 0){
            return INF;
        }
        if(n == 0){
            return 0;
        }
        int result = INF;
        for(int i = n / money[depth] ; i >= 0 ; i--){
            result = Math.min(result,dfs(depth+1,n - money[depth] * i,dp) + i);
            if(result != INF){
                break;
            }
        }
        dp[n] = result;
        return result;
    }
}