Cute Dog Bopping Head
본문 바로가기
Code IT/Algorithm

[프로그래머스] N으로 표현 - Dynamic Programming (Java)

by 찾 2021. 4. 3.
import java.util.*;

class Solution {
    public int solution(int N, int number) {
        int answer = -1;
        
        HashMap<Integer,HashSet<Integer>> hm = new HashMap<>();
        HashSet<Integer> hs = new HashSet<>();
        
        hs.add(N);
        hm.put(1,hs);
        
        loop: for(int i=2; i<9; i++){
            HashSet<Integer> set = new LinkedHashSet<>();
            int NNN = Integer.parseInt(Integer.toBinaryString((int)Math.pow(2,i)-1))*N;
            
            if(NNN == number) return i;
            
            set.add(NNN);
            
            for(int j=1;j<i;j++){
                Iterator<Integer> it1 = hm.get(j).iterator();
                Iterator<Integer> it2 = hm.get(i-j).iterator();
                
                while(it1.hasNext()) {
                    int itValue1 = it1.next();
                    while(it2.hasNext()) {
                        int itValue2 = it2.next();
                        
                        for(Operator o : Operator.values()){
                            int calculate = o.calculate(itValue1,itValue2);
                            if(calculate == number) {
                                answer = i;
                                break loop;
                            }
                            set.add(calculate);
                        }
                    }
                }
            }
            hm.put(i,set);
        }

        return answer;
    }
    
    enum Operator {
        ADD {
            @Override
            public int calculate(int a, int b) {
                return a + b;
            }
        },
        
        SUB {
            @Override
            public int calculate(int a, int b) {
                if(a>=b) return a - b;
                else return b - a;
            }
        },
        
        MUL {
            @Override
            public int calculate(int a, int b) {
                return a * b;
            }
        },
        
        DIV {
            @Override
            public int calculate(int a, int b) {
                
                if(a>=b && b != 0) return a / b;
                else if(a < b && a != 0) return b / a;
                else return 0;
            }
        };
        
        public abstract int calculate(int a, int b);
    }
}

댓글