DP

N으로 표현

💡 Dynamic Programming

import java.util.*;

class Solution {
    public void unionSet(Set<Integer> union, Set<Integer> a, Set<Integer> b) {
        for (int n1 : a) {
            for (int n2 : b) {
                union.add(n1 + n2);
                union.add(n1 - n2);
                union.add(n1 * n2);
                if (n2 != 0)
                    union.add(n1 / n2);
            }
        }
    }
    public int solution(int N, int number) {
        List<Set<Integer>> setList = new ArrayList<>();
        
        for (int i = 0; i < 9; i++) {
            setList.add(new HashSet<>());
        }
        
        setList.get(1).add(N);
        
        if (number == N) return 1;
        
        for (int i = 2; i < 9; i++) {
            for (int j = 1; j <= i / 2; j++) {
                unionSet(setList.get(i), setList.get(i - j), setList.get(j));
                unionSet(setList.get(i), setList.get(j), setList.get(i - j));
            }
            String n = Integer.toString(N);
            setList.get(i).add(Integer.parseInt(n.repeat(i)));
            for (int num : setList.get(i)) {
                if (num == number) return i;
            }  
        }
        
        return -1;
    }  
}
import java.util.HashSet;
import java.util.Set;

class Solution {
    public int solution(int N, int number) {
       int answer = -1;
        Set<Integer>[] setArr = new Set[9];
        int t = N;
        for(int i = 1; i < 9; i++) {
            setArr[i] = new HashSet<>();
            setArr[i].add(t);
            t = t * 10 + N;
        }
        for(int i = 1; i < 9; i++) {
            for(int j = 1; j < i; j++) {
                for(Integer a : setArr[j]) {
                    for(Integer b : setArr[i - j]) {
                        setArr[i].add(a + b);
                        setArr[i].add(a - b);
                        setArr[i].add(b - a);
                        setArr[i].add(a * b);
                        if(b != 0) {
                            setArr[i].add(a / b);
                        }
                        if(a != 0) {
                            setArr[i].add(b / a);
                        }
                    }
                }
            }
        }
        for(int i = 1; i < 9; i++) {
            if(setArr[i].contains(number)) {
                answer = i;
                break;
            }
        }
        return answer;
    }
}
import java.util.*;

class Solution {
    public int solution(int N, int number) {
        List<Set<Integer>> countList = new ArrayList<>();

            for(int i=0; i<9; i++)
                countList.add(new HashSet<>());

            countList.get(1).add(N); 

            for(int i=2; i<9; i++){
                Set<Integer> countSet = countList.get(i);

                for(int j=1; j<=i; j++){
                    Set<Integer> preSet = countList.get(j);
                    Set<Integer> postSet = countList.get(i - j);

                    for(int preNum : preSet){
                        for(int postNum : postSet){
                            countSet.add(preNum + postNum);
                            countSet.add(preNum - postNum);
                            countSet.add(preNum * postNum);

                            if(preNum != 0 && postNum != 0)
                                countSet.add(preNum / postNum);
                        }
                    }
                }

                countSet.add(Integer.parseInt(String.valueOf(N).repeat(i)));
            }

            for(Set<Integer> sub : countList){
                if(sub.contains(number))
                    return countList.indexOf(sub);
            }

            return -1;
    }
}
class Solution {
    int answer = -1;

    public int solution(int N, int number) {
        dfs(N, 0, 0, number, "");
        return answer;
    }

    public void dfs(int n, int pos, int num, int number, String s) {
        if (pos > 8)
            return;
        if (num == number) {
            if (pos < answer || answer == -1) {
                System.out.println(s);
                answer = pos;
            }
            return;
        }
        int nn=0;
        for (int i = 0; i < 8; i++) {
            nn=nn*10+n;
            dfs(n, pos + 1+i, num + nn, number, s + "+");
            dfs(n, pos + 1+i, num - nn, number, s + "-");
            dfs(n, pos + 1+i, num * nn, number, s + "*");
            dfs(n, pos + 1+i, num / nn, number, s + "/");
        }
        // dfs(n,pos+1,num*10+n,number,s+"5");
    }
}

import java.util.*;

class Solution {
    
    static int min = Integer.MAX_VALUE;
    
    public int solution(int N, int number) {
        dfs(0, N, number, 0);
        
        if (min == Integer.MAX_VALUE) return -1;
        return min;
    }
    
    public void dfs(int depth, int N, int number, int current) {
        if (depth > 8) {
            return;
        }
        
        if (number == current) {
            min = Math.min(depth, min);
            return;
        }
        
        int temp = 0;
            
        for (int i = 0; i < 8; i++) {
            if (depth + i < 8) {
                temp = temp * 10 + N;
                dfs(depth + i + 1, N, number, current + temp);
                dfs(depth + i + 1, N, number, current - temp);
                dfs(depth + i + 1, N, number, current / temp);
                dfs(depth + i + 1, N, number, current * temp);     
            }      
        }
    }
}

정수 삼각형

class Solution {
    public int solution(int[][] triangle) {
        int[][] dp = new int[triangle.length][triangle.length];
        dp[0][0] = triangle[0][0];
        
        for (int i = 1; i < triangle.length; i++) {
            dp[i][0] = dp[i - 1][0] + triangle[i][0];
            
            for (int j = 1; j <= i; j++) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1]) + triangle[i][j];
            }
            
            dp[i][i] = dp[i - 1][i - 1] + triangle[i][i];
        }
        
        int answer = 0;
        
        for (int i = 0; i < triangle.length; i++) {
            answer = Math.max(answer, dp[triangle.length - 1][i]);
        }
        
        return answer;
    }
}

등굣길

import java.util.*;
 
class Solution {
    public int solution(int m, int n, int[][] puddles) {
        int mod = 1000000007;
        
        int[][] board = new int[n + 1][m + 1];
        for(int i = 0; i < puddles.length; i++) {
            board[puddles[i][1]][puddles[i][0]] = -1; 
        }
        
        board[1][1] = 1;
        for(int i = 1; i < n + 1; i++) {
            for(int j = 1; j < m + 1; j++) {
                if(board[i][j] == -1) continue;
                if(board[i - 1][j] > 0) board[i][j] += board[i - 1][j] % mod;
                if(board[i][j - 1] > 0) board[i][j] += board[i][j - 1] % mod;
            }
        }
        return board[n][m] % mod;
    }
}

사칙연산

도둑질

import java.util.*;

class Solution {
    public int solution(int[] money) {
        int[] dpf = new int[money.length];
        int[] dps = new int[money.length];
        
        for (int i = 0; i < money.length; i ++) {
            dpf[i] = money[i];
            dps[i] = money[i];
        }
        
        dpf[1] = -1;
        dps[0] = -1;
        dpf[2] += dpf[0];
        
        for (int i = 3; i < money.length; i++) {
            dpf[i] += Math.max(dpf[i - 2], dpf[i - 3]);
            dps[i] += Math.max(dps[i - 2], dps[i - 3]);
        }
        
        int f = Math.max(dpf[money.length - 2], dpf[money.length - 3]);
        int s = Math.max(dps[money.length - 1], dps[money.length -2]);
        return Math.max(f, s);
    }
}

Last updated