Week 4 (Dp) - 문제 1463번 (1로 만들기)
2023. 7. 22. 18:32ㆍ백준 문제와 소스 코드
문제:
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력:
첫째 줄에 1보다 크거나 같고, 10^6보다 작거나 같은 정수 N이 주어진다.
출력:
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
예제 입력1:
2
예제 출력1:
1
예제 입력2:
10
예제 출력2:
3
코드:
#include <iostream>
using namespace std;
int dp[1000001]; //값을 저장하고 쓸 배열 저장 선언 (Dp)
int main()
{
//Bottom-Up 방식
dp[1] = 0; //기저 상태 선언
int N; //문제에서의 N 선언 후 입력받기
cin >> N;
for (int i = 2; i <= N; i++)
{
dp[i] = dp[i - 1] + 1; //우선은 전 단께에서 1 뺴는 단계를 하나 더한 걸로 저장
if (i % 3 == 0)
{
if (dp[i] > dp[i / 3] + 1)
dp[i] = dp[i / 3] + 1;
}
//3으로 나누어진다면
//3으로 나눠서 그 단계의 값에다가 나눈 한 단계를 더한 값이
//-1을 하여 나온 그 단계의 값과 -1을 한 한 단계를 더한 값을 비교해
//더 작은 값을 저장
if (i % 2 == 0)
{
if (dp[i] > dp[i / 2] + 1)
dp[i] = dp[i / 2] + 1;
}
//2로 나누어진다면
//2로 나눠서 그 단계의 값에다가 나눈 한 단계를 더한 값이
//-1을 하여 나온 그 단계의 값과 -1을 한 한 단계를 더한 값을 비교해
// (혹은 위에서 3으로 나눠졌다면 저장된 dp[i]의 값과 비교해)
//더 작은 값을 저장
}
cout << dp[N]; //출력
}
설명:
주석 참고
'백준 문제와 소스 코드' 카테고리의 다른 글
| Week 4 (Dp) - 문제 9465번 (스티커) (0) | 2023.07.25 |
|---|---|
| Week 4 (Dp) - 문제 1699번 (제곱수의 합) (0) | 2023.07.24 |
| Week 4 (Dp) - 문제 11726번 (2×n 타일링) (0) | 2023.07.22 |
| Week 4 (Dp) - 문제 1904번 (01타일) (0) | 2023.07.22 |
| Week 4 (Dp) - 문제 2193번 (이친수) (0) | 2023.07.21 |