티스토리 뷰

반응형

www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

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

www.acmicpc.net

- 문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
2. X가 2로 나누어 떨어지면, 2로 나눈다.
3. 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

- 코드

#include <iostream>
#include <algorithm>
using namespace std;
int dp[1000001];

int solution(int n)
{
    fill_n(dp, 1000001, 0); //초기화
    for (int i = 2; i <= n; i++)
    {
        dp[i] = dp[i - 1] + 1; //1을 빼주는 경우
        if (i % 2 == 0)
            dp[i] = min(dp[i], dp[i/2] + 1);//2로 나눠주는 경우
        if (i % 3 == 0)
            dp[i] = min(dp[i], dp[i/3] + 1);//3으로 나눠주는 경우
    }
    return dp[n];
}

int main() {
    int X;
    int count = 0;

    cin >> X;
    cout << solution(X) << "\n";
    return 0;
}

3가지 연산 뿐이니, 각각의 연산을 적용했을 때 연산 횟수의 최솟값을 구한다.

반응형

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

[백준/15552번] 빠른 A+B (C++)  (0) 2020.09.08
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함