티스토리 뷰

문제 링크

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

 

1463번: 1로 만들기

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

www.acmicpc.net

 

1부터 입력으로 받은 n까지 bottom-up 방식으로 3가지 연산방식의 최솟값을 구해나가야 합니다.

 

먼저 n이 1인 경우 연산을 할 필요가 없으므로 0 입니다. d[1] = 0

1. n에서 1을 빼는 경우는 n-1의 최솟값에서 한 번의 연산 횟수(1을 뺀다)가 추가됩니다. 

2. n이 2로 나누어 떨어지면 n / 2의 최솟값에서 한 번의 연산 횟수(2로 나눈다)가 추가됩니다. 

3. n이 3으로 나누어 떨어지면 n / 3의 최솟값에서 한 번의 연산 횟수(3으로 나눈다)가 추가됩니다. 

 

위 3가지 중 최솟값이 정답이 됩니다.

 

 

구현 코드

 

#include <iostream>
#include <algorithm>
#define endl '\n'
#define fastio cin.sync_with_stdio(false); cin.tie(nullptr)
using namespace std;
const int MAX = 1000001;
int d[MAX];
int main(){
fastio;
int n;
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] << endl;
return 0;
}
view raw 1463.cpp hosted with ❤ by GitHub
n = int(input())
dp = []
dp.append(0)
dp.append(0)
for i in range(2,n+1):
dp.append(dp[i-1] + 1)
if i % 2 == 0:
dp[i] = min(dp[i], dp[i // 2] + 1)
if i % 3 == 0:
dp[i] = min(dp[i], dp[i // 3] + 1)
print(dp[n])
view raw 1463.py hosted with ❤ by GitHub