alorithm/programmers

[LeetCode] Coin Change

Hannana. 2024. 8. 13. 01:57
728x90
반응형

https://leetcode.com/problems/coin-change/description/

 

문제 파악

-트리를 타고 내려가며 주어진 amount값을 최소한의 갯수로 채우기

-dfs를 활용한 그리디 알고리즘으로 해석

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

접근 방법

-(최적) 그리디 알고리즘

-(차선) 일단, 동전 금액이 큰 것부터 적용시켜야 유리하므로 정수 배열 내림차 순 정렬하기

-dfs함수 구현(total은 0에서 시작, 경우의 수에 따라 누적해가기 and backtrack())

-금액이 들어가면 리스트에 누적해가다가 total이 amount와 동일해지면 return,

그렇지 않으면 recursive 또 돌면서 total 누적해가기

코드 구현

(그리디)

import java.util.*;

class Solution {
    public int coinChange(int[] coins, int amount) {
        int max = amount + 1;
        int[] dp = new int[max];
        Arrays.fill(dp, max);
        dp[0] = 0;
        
        for (int i = 1; i <= amount; i++) {
            for (int coin : coins) {
                if (i - coin >= 0) {
                    dp[i] = Math.min(dp[i], dp[i - coin] + 1);
                }
            }
        }
        
        return dp[amount] > amount ? -1 : dp[amount];
    }
}

(DFS)

import java.util.*;
class Solution {
    public int coinChange(int[] coins, int amount) {
        int n=coins.length;
        Integer[] coinsArr = new Integer[n];
        //int[] -> Integer[]
        for(int i=0;i<n;i++) coinsArr[i] = coins[i];
        Arrays.sort(coinsArr,Collections.reverseOrder());
        List<Integer> result = new ArrayList<>();
        dfs(coinsArr,amount,0,result);
        System.out.println(result.toString());
        if(result.size()==1) return -1;
        return result.size();
    }
    public void dfs(Integer[] coinsArr,int amount,int total,List<Integer> result){
        if(total==amount){
            System.out.println("total은"+total);
            return;
        }
        for(int i=0;i<coinsArr.length;i++){
            if(coinsArr[i]>amount) continue;
            if(coinsArr[i]<amount){
                if((total+coinsArr[i])>amount){
                    continue;
                }else if((total+coinsArr[i])<=amount){
                    result.add(coinsArr[i]);
                    dfs(coinsArr,amount,total+coinsArr[i],result);
                    return;
                }
            }
        }
    }
}

배우게 된 점

그리디를 이용한 풀이가 더 빠르다는 것을 알게되었다.

반응형

'alorithm > programmers' 카테고리의 다른 글

[LeetCode] Keys and Rooms  (0) 2024.08.13
[LeetCode] Is Graph Bipartite?  (0) 2024.08.13
[프로그래머스] 네트워크  (0) 2024.08.13
[프로그래머스] 단어 변환  (0) 2024.08.13
[프로그래머스] 타겟 넘버  (0) 2024.08.13