Coins 질문드립니다

  • kingik
    kingik
    import java.util.HashMap;
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Coins {
    
        private int mChange;
        private int[] mCoins;
        private HashMap<Integer, Long>[] mCache;
    
        @SuppressWarnings("unchecked")
        public Coins(int change, int[] coins){
            mChange = change;
            mCoins = Arrays.copyOf(coins, coins.length);
            mCache = new HashMap[mCoins.length];
            for(int i=0; i<mCoins.length; i++){
                mCache[i] = new HashMap<Integer, Long>();
            }
        }
    
        public long calChange(int sum, int coinIdx){
    
            if(mCache[coinIdx].containsKey(sum)){
                return mCache[coinIdx].get(sum);
            }
    
            long nPossible =0;
            int left = mChange -sum;
            if(coinIdx ==0){
                if(left%mCoins[coinIdx] ==0) 
                    return 1;
                else    return 0;
            }
    
            for(int i=0; i<left/mCoins[coinIdx]+1; i++){
                nPossible+=calChange(sum+mCoins[coinIdx]*i, coinIdx-1);
            }
            if(!mCache[coinIdx].containsKey(sum)) mCache[coinIdx].put(sum, nPossible);
    
            return nPossible;
        }
    
        public int nChange(){
            long nPossible =0;
            int bCoin = mCoins[mCoins.length-1];
            for(int i=0; i<mChange/bCoin+1; i++){
                nPossible+=calChange(i*bCoin, mCoins.length-2);
            }
            if(nPossible>1000000007){
                return (int)nPossible%1000000007;
            }
            return (int)nPossible;
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int cases = sc.nextInt();
            while(cases-- >0){
                int change = sc.nextInt();
                int [] coins = new int[sc.nextInt()];
                for(int i=0; i<coins.length; i++){
                    coins[i] = sc.nextInt();
                }
                Coins c = new Coins(change, coins);
                System.out.println(c.nChange());
            }
            sc.close();
        }
    
    }
    

    문제에 있는 예제는 이 코드가 문제없이 잘 풀어내는데
    답안 제출하면 런타임 오류가 뜹니다. hashMap의 크기가 너무 커져서 그런것인가요?


    7년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.