본문 바로가기
알고리즘/백준 BOJ

1463. 1로 만들기

by 꾸준하곰 2022. 8. 5.

1. 해결방법

  • Dynamic Programming 문제이다.
  • DP[n] 의 의미는 n을 1로 만들 수 있는 최소 연산 횟수이다.
  • DP[0] = DP[1] = 0 ☞ 0은 범위 밖이고, 1을 1로 만들기 위한 연산은 0번이기 때문이다.
  • DP[2] = 1, DP[3] = 1 
  • 그렇다면 DP[4] 는 ??? DP[4] 는 N-1 로 3으로 만들고(1회) + DP[3] 이다.
  • 즉, DP[N] = DP[N-1] + 1  또는  DP[N] = DP[N/2] + 1  또는  DP[N] = DP[N/3] + 1 이다.

 

2. Solution

// Dynamic Programming
#include <iostream>
#include <vector>

#define MAX 1000000 + 1
#define endl "\n"

using namespace std;

int N, answer = 0;
int DP[MAX];

void Input()
{
    cin >> N;
}

void Solution()
{
    DP[0] = 0;
    DP[1] = 0;

    for(int i = 2; i <= N; i++)
    {
        DP[i] = DP[i - 1] + 1;
        if(i % 3 == 0) DP[i] = min(DP[i], DP[i / 3] + 1);
        if(i % 2 == 0) DP[i] = min(DP[i], DP[i / 2] + 1);
    }

    cout << DP[N] << endl;
}

int main()
{
    Input();
    Solution();
    return 0;
}

'알고리즘 > 백준 BOJ' 카테고리의 다른 글

2193. 이친수  (0) 2022.08.17
2156. 포도주 시식  (0) 2022.08.17
1149. RGB거리  (0) 2022.08.05
1003. 피보나치 함수  (0) 2022.08.02
2667. 단지번호 붙이기  (0) 2022.07.09

댓글