백준 1463번, 1로 만들가
백준 1463번 c++ 문제풀이
문제:
풀이:
- dp로 접근했다.
- 최소 횟수를 저장한 배열을 만든다. 이 배열을 dp[]라고 해보자.
- 2부터 1로 만들 수 있는 횟수를 배열에 저장한다.
- 입력값 input이 2로 나눌 수 있다면 dp[input]은 dp[input/2]와 dp[input-1]을 비교해 둘중 더 작은 횟수에 1을 더한값(2로 나누거나 1을 빼는 과정이 추가되었기에)이다.
- 3으로 나눌 수 있는 수이면 위와 같은 과정을 수행해주면된다.
- 2와 3 둘다 나뉜다면 위의 4, 5 과정에서 구한 값을 비교하여 둘중 더 작은 값을 저장 해주면 된다.
- 2와 3 둘로 다 나뉘지 않는다면 무조건 dp[input] = dp[input-1]+1 이다.
코드:
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
32
33
34
35
#include <iostream>
using namespace std;
int dp[1000001];
void countp(int x){
for(int i = 2 ; i <= x ;i++){
if(i % 2 == 0 && i % 3 == 0){
dp[i] = min(min(dp[i - 1], dp[i / 2]) + 1,min(dp[i - 1], dp[i / 3]) + 1);
}
else if (i % 2 == 0) {
dp[i] = min(dp[i - 1], dp[i / 2]) + 1;
} else if (i % 3 == 0) {
dp[i] = min(dp[i - 1], dp[i / 3]) + 1;
} else {
dp[i] = dp[i - 1] + 1;
}
}
}
int main(void){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int x;
cin >> x;
countp(x);
cout << dp[x];
return 0;
}
처음 풀었을 때 2와 3 둘다 나눠지는 조건을 빼먹어 애를 먹었던 것 같다. 그 조건은 다른 분이 알려주셔서 빼먹은 것을 알 수 있었다.
감사합니다.
This post is licensed under CC BY 4.0 by the author.