티스토리 뷰

문제

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

풀이과정

기본적인 DP 문제 중 하나이다. D[i] = i를 1로 만드는 데 필요한 최소 연산 횟수라고 놓고 경우의 수를 생각해보니 아래와 같았다.

  1. i가 3으로 나누어 떨어질 경우

    D[i/3] + 1

  2. i가 2로 나누어 떨어질 경우

    D[i/2] + 1

  3. i에서 1을 빼는 경우

    D[i-1] + 1

이렇게 총 세 가지이며 세 가지의 경우 중 최소값을 찾으면 된다.

소스코드

#include <iostream>

using namespace std;

#define MAX 1000001

int D[MAX];

int solution(int N)
{
    if (N==1) return 0;
    if (D[N] > 0) return D[N];

    D[N] = solution(N - 1) + 1;

    if (N % 2 == 0)
    {
        int tmp = solution(N / 2) + 1;
        if (D[N] > tmp) D[N] = tmp;
    }

    if (N % 3 == 0)
    {
        int tmp = solution(N / 3) + 1;
        if (D[N] > tmp) D[N] = tmp;
    }

    return D[N];
}
int main()
{
    int N;

    cin >> N;

    cout << solution(N);

    return 0;
}

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

[백준] 4963번 섬의 개수  (0) 2018.02.05
[백준] 1003번 피보나치 함수  (0) 2018.01.30
[백준] 10448번 유레카 이론  (0) 2018.01.24
[백준] 2667번 단지번호붙이기  (0) 2018.01.19
[백준] 2331번 반복수열  (0) 2018.01.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함