-
백준(BOJ) 1463번 1로 만들기알고리즘 풀이/백준(Boj) 2019. 7. 8. 03:54
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
나의풀이 :
동적 계획법을 통해 풀었다. 런타임 에러가 나온다면 MAX에 0이 5개나 7개는 아닌지 봐보자.
코드 ( C ++ )
#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 10000000;
int cache[MAX + 1];
const int INF = 987654321;
int solve(int x)
{
int& ret = cache[x];
if (ret != -1)
return ret;
if (x == 1) return 0; // 1을 만들었다면 0 반환
ret = INF;
if (x % 3 == 0) ret = min(ret,solve(x / 3) + 1); // 3으로 나뉘었을때는 그 수를 택하므로 +1 해준다
if (x % 2 == 0) ret = min(ret,solve(x / 2)+1); //2로 나뉘었을때 그 수를 택하므로 +1을 해준다,
return ret = min(ret, solve(x - 1)+1); // -1해줄때 그 수를 택하므로 +1 해준다. 나누기 3과 2와 1중 최소를 찾아서 반환해준다.
}
int main()
{
memset(cache, -1, sizeof(cache));
cache[0] = cache[1] = 0;
int num;
cin >> num;
int result = solve(num);
cout << result << endl;
return 0;
}
'알고리즘 풀이 > 백준(Boj)' 카테고리의 다른 글
백준(BOJ) 2579번 계단 오르기 (0) 2019.07.10 백준(BOJ) 9095번 1,2,3 더하기 (0) 2019.07.09 백준(BOJ) 1158번 조세푸스 문제 (0) 2019.07.08 백준(BOJ) 1965번 상자넣기 (0) 2019.07.07 백준(BOJ) 11727번 2xn 타일링 2 (0) 2019.07.06