알고리즘 기초1 Java

다이나믹 프로그래밍_1463 번 : 1로 만들기 JAVA

람대리 2024. 3. 29. 16:48
728x90

 

재귀 호출을 이용하여 푼다. 재귀 호출을 하면서 동시에 count를 증가시킨다. N=1되기 전까지 count를 누적시키다 N이 1이 된다면 count를 return시킨다.

N을 각각 2와 3으로 나누면, count에는 +1에 각 연산의 나머지값을 더한 값이 들어간다. 나머지값은 빼기 1 했을때 count와 같기 때문이다. 재귀 호출을 이용하므로  다이내믹 프로그래밍 Top-down 방식이다.

 

import java.io.*;

public class Main{
	public static void main(String[] args){
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        System.out.println(recur(N,0));
    }
    public static int recur(int N, int count){
    	if(N<2)
        	return count;
        return Math.min(recur(N/3,count+1+(N%3)),recur(N/2,count+1+(N%2)));
    }
}

 

다음은 Bottom-up 방식을 이용한 풀이이다.

풀이 절차는 다음과 같다.

1. 테이블식 정의

2. 점화식 찾기

3. 초기값 정하기

 

테이블식 정의

D[i]에는 i가 1을 만들때 연산하는 횟수의 최솟값

 

점화식 찾기

D[i] = Math.min(3으로 나눌때, 2로 나눌때, 1로 뺄 때)

만약 3이 온다면 3으로 나누면 1이 된다. 1은 횟수의 최솟값이 0이고 3에서 3을 나눴을 때 연산이 추가되었으므로 D[1] 값에서 1을 추가한다.

 

초기값 찾기

D[0] = D[1] = 1

 

import java.io.*;

public class Main{
	public static void main(String[] args){
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        System.out.println(countMake1(N));
    }
    public static int countMake1(int N){
    	int[] D = new int[N+1];
        D[0] = D[1] = 0;
        for(int i=2;i<=N;i++){
        	D[i] = D[i-1] + 1;
            if(i%2==0)
            	D[i] = Math.min(D[i],D[i/2]+1);
            if(i%3==0)
            	D[i] = Math.min(D[i],D[i/3]+1);
        }
        return D[N];
    }
}