# 생각

BFS로 작성하게되면 dist값 초기 0에서 *2, *3, +1을 하여 해결할 수 있다

 

DP를 이용하면 짧은 코드로 해결이 가능하다

초기값 : d[1] = 0

점화식 : i = 2 부터 n까지 for문을 돌면서 d[i]를 d[i-1] + 1, d[i/2] + 1, d[i/3] + 1을 가지고 갱신

 

 

# 전체 코드

#include <bits/stdc++.h>
using namespace std;

int d[1111111];
int n;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	cin >> n;
	for (int i = 2; i <= n; i++)
	{
		d[i] = d[i - 1] + 1;
		if (i % 2 == 0) d[i] = min(d[i], d[i / 2] + 1);
		if (i % 3 == 0) d[i] = min(d[i], d[i / 3] + 1);
	}
	cout << d[n];
}

 


https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

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

www.acmicpc.net

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 1149_RGB거리 with cpp  (0) 2022.03.04
[BOJ] 9095_1,2,3 더하기 with cpp  (0) 2022.03.02
[BOJ] 10825_국영수 with cpp  (0) 2022.03.01
[BOJ] 11656_접미사 배열 with cpp  (0) 2022.03.01
[BOJ] 2910_빈도 정렬 with cpp  (0) 2022.03.01

+ Recent posts