알고리즘/Baekjoon

백준 1463: 1로 만들기 (C++)

개발하는 크롱 2020. 11. 25. 10:46
반응형

문제 링크: www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

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

www.acmicpc.net

 

2~1000000까지 1로 만드는 최소 연산 횟수를 먼저 계산한다.

작은 수에 대해서 먼저 계산하고 그 값을 저장해 재활용함으로써 불필요한 연산을 줄일 수 있다.

 

#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX 1000001

int arr[MAX]; //1로 만드는 연산 횟수 저장

void count() {
	for (int i = 2; i <= MAX; ++i) {
		arr[i] = arr[i - 1] + 1;
		if (i % 2 == 0) arr[i] = min(arr[i], arr[i / 2] + 1);
		if (i % 3 == 0) arr[i] = min(arr[i], arr[i / 3] + 1);
	}
}

int main() {
	int in;
	count();
	scanf("%d", &in);
	printf("%d", arr[in]);
}
반응형