반응형
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
출처:https://www.acmicpc.net/problem/1463
문제 풀이
동적 계획법 문제로 간단한 문제이다
각 n을 1로 만든느 최솟값을 Dp[n]이라고 하면 3으로 나누어 질때 2로 나누어 질때 그리고 나누어 지지 않을떄로 계산한다.
1) 나누어지지 않으면 세번째 규칙을 사용하여 Dp[n]=Dp[n-1]+1 이 나온다
2) 2로만 또는 3으로만 나누어진다면 2또는 3으로 나눈 Dp[n/3]과 Dp[n/2](첫번째 두번 규칙)를 Dp[n-1](세번째 규칙)을 비교하여
작은 값을 저장한다.
3) 2와 3 둘다 나누어진다면 각각의 경우를 비교한다.
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 | #include<iostream> using namespace std; int main(){ int cnt=0; int N; scanf("%d",&N); int* Dp = new int[N+1]; Dp[0]=0; Dp[2]=Dp[3]=1; for(int i=4;i<=N;i++){ if(i%2==0||i%3==0){ if(i%2!=0){ Dp[i]=min(Dp[i-1],Dp[i/3])+1; } else if(i%3!=0){ Dp[i]=min(Dp[i-1],Dp[i/2])+1; } else{ Dp[i]=min(Dp[i/2],Dp[i/3])+1; } } else{ Dp[i]=Dp[i-1]+1; } } cout<<Dp[N]<<endl; } | cs |
반응형
'군대에서 한것 > 백준 알고리즘' 카테고리의 다른 글
<백준>2293번 동전 1 (0) | 2018.08.19 |
---|---|
<백준>11720번 숫자의 합 (0) | 2018.08.19 |
<백준> 2438번~2441번 별찍기 1,2,3,4 (0) | 2018.08.19 |
<백준> 2156번 포도주 시식 (0) | 2018.08.19 |
[군대]<백준>2292번 벌집 (0) | 2018.08.11 |