BOJ

백준 1463 - 1로 만들기

yanJuicy 2019. 5. 12. 20:10
반응형

문제

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

 

1463번: 1로 만들기

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

www.acmicpc.net

 

풀이

이 문제의 경우 N을 1로 만드는 최소 횟수를 f(N) 이라 하면 점화식은 다음과 같이 나온다.

f(N) = min {

    0 (N=1일 때)

    f(N/3) + 1 (N이 3의 배수일 때)

    f(N/2) + 1 (N이 2의 배수일 때)

    f(N-1) + 1

N/3, N/2, N-1을 했을 경우 연산의 횟수를 추가해야 하므로 + 1을 해준다.

 

코드

탑다운 방식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int dp[1000001];
 
int makeOne(int n)
{
    if (n == 1return 0;
    if (dp[n] != -1return dp[n];
 
    int result = makeOne(n - 1+ 1;
    if (n % 3 == 0)
        result = min(result, makeOne(n / 3+ 1);
    if (n % 2 == 0)
        result = min(result, makeOne(n / 2+ 1);
    dp[n] = result;
    return result;
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    for (int i = 0; i < 1000001; i++)
        dp[i] = -1;
 
    int N;
    cin >> N;
 
    cout << makeOne(N);
 
    return 0;
}
 
cs

 

 

바텀업 방식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include &lt;iostream&gt;
#include &lt;algorithm&gt;
 
using namespace std;
 
int N;
int dp[1000001];
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    cin >> N;
 
    for (int i = 1; i <= N; i++) dp[i] = i - 1;
 
    for (int i = 2; i <= N; i++)
    {
        if (!(i % 3)) dp[i] = min(dp[i], dp[i / 3+ 1);
        if (!(i % 2)) dp[i] = min(dp[i], dp[i / 2+ 1);
        dp[i] = min(dp[i], dp[i - 1+ 1);
    }
 
    cout << dp[N];
 
    return 0;
}
cs

 

 
반응형

'BOJ' 카테고리의 다른 글

백준 9465 - 스티커  (0) 2019.05.14
백준 10448 - 유레카 이론  (0) 2019.05.14
백준 3085 - 사탕 게임  (0) 2019.05.12
백준 1912 - 연속합  (0) 2019.05.07
백준 1969 - DNA  (0) 2019.04.10