알고리즘/백준

백준 1463_1로 만들기

래울 2020. 8. 17. 10:25
 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net

 

동적계획법을 사용한 문제

 

Top_down 재귀문을 사용해 풀이하면...

n에 대해 min(3또는 2로 나눈 경우, n-1의 경우)에서 작은 값만을 선택해가면서 답을 구할 수 있다.

 

ex)

10

10은 2로 나누어지기 떄문에 min(make_1(5), make_1(9))

 

5는 1+make_1(4)

9는 1+min(make_1(3), make_1(8))

 

...

 

10 -> 9 -> 3 -> 1 

결과값 : 4

#include <stdio.h>
int min(int a, int b){
        return a > b ? b : a;   //최소값 return
}
int make_1(int n){
        if(n==1)
                return 0;
        if(!(n%3))
                return 1+min(make_1(n/3), make_1(n-1));
        if(!(n%2))
                return 1+min(make_1(n/2), make_1(n-1));
        return 1+make_1(n-1);
}
int main(){
        int n;
        scanf("%d",&n);
        printf("%d\n", make_1(n));
        return 0;
}