알고리즘/백준 알고리즘

[java] 백준 알고리즘 1463번 1로 만들기 풀이 소스

희랍인 조르바 2018. 4. 23. 19:24


다이나믹 프로그래밍 첫 문제.


**아래 풀이소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Baekjoon1463 {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int X = sc.nextInt();
        
        int[] min = new int[1000001]; // 10의 6승이 최대값이기 때문에
        
        min[1= 0// 계산하기 쉬우려고 배열은 0번부터 시작하지만 인위적으로 1부터 시작하는 것처럼 만듦.
        
        for(int i=2; i<X+1; i++){
            min[i] = min[i-1+1// 3이나 2로 나누어지지 않으면 주어진 숫자의 1 작은 수에 대한 최소 연산횟수 + (-1) 연산을 한 횟수
            
            if(i%2 == 0 && min[i/2+ 1 < min[i]){
                min[i] = min[i/2+ 1// 2로 바로 나누어 지는 경우 최솟값 비교해서 작은 연산 횟수로 대입.
            }
            if(i%3 == 0 && min[i/3+ 1 < min[i]){
                min[i] = min[i/3+ 1// 3으로 바로 나누어질 때, 대입된 값에 대한 비교가 이뤄지므로 모든 경우에 대한 비교가 성립.
                                        // (-1) 연산이 이뤄진 횟수와 2로 바로 나누었을 때에 대한 최종 값이 마지막 min[i]에 들어오기 때문이다.
            }
            
        }
        System.out.println(min[X]);
    }
 
}
 
cs