사용언어 : C++
문제풀이
* 핵심:dynamic programming이용(https://developing-soosoo.tistory.com/6 dynamic programming 설명은 여기로)
3가지 경우의 수 존재, 3가지 공식을 다 실행해준다 (min을 통해 알아서 최솟값으로 변경해줌)
- vector d의 1번째 index값은 0으로 고정
vector<int> d(n + 1); //n은 입력값
d[1] = 0;
- for문으로 2부터(1엔 0존재) n이 될 때까지 실행
for (int i = 2; i <= n; i++) {
//
}
- for문 안에 3가지 경우의 수 작성
//for (int i = 2; i <= n; i++) {
d[i] = d[i - 1] + 1; //조건이 없는 -1공식
if (i % 2==0) //2로 나누어 떨어질 때
d[i] = min(d[i], d[i / 2] + 1);
if (i % 3==0) //3으로 나누어 떨어질 때
d[i] = min(d[i], d[i / 3] + 1);
// }
전체코드
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
int n;
int main() {
cin >> n;
vector<int> d(n + 1);
d[1] = 0;
for (int i = 2; i <= n; i++) {
d[i] = d[i - 1] + 1;
if (i % 3==0)
d[i] = min(d[i], d[i / 3] + 1);
if (i % 2==0)
d[i] = min(d[i], d[i / 2] + 1);
}
cout << d[n];
}
총평
처음엔 3가지 경우의 수가 있는데 그 중 어떤 공식을 선택해야 최솟값이 나오나 고민하느라 애썼는데 굳이 그럴 필요 없이 하나하나 다 해보면서 기존의 최솟값(d[index]값)과 비교해 더 작은 값으로 변경해주면 된다는 걸 알고 약간 후련하면서도 허무했다.. ㅎ dynamic programming 관련 문제를 풀어보면서 겉으로 보기엔 각자 다 다른 문제 같았는데 막상 본질은 다 같았다. 신기하면서도 앞으로 내가 숨겨진 본질을 잘 찾을 수 있을지 설렘 반 걱정 반..ㅎㅎ
문제 출처
https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
'CodingTest > BOJ' 카테고리의 다른 글
[BOJ 2562] 백준 최댓값 풀이 - C++ (0) | 2021.09.07 |
---|---|
[BOJ 2439] 백준 별 찍기 - 2 풀이 -C++ (0) | 2021.09.06 |
[BOJ 2739] 백준 구구단 풀이 - C++ (0) | 2021.09.05 |
[BOJ 10871] 백준 X보다 작은 수 풀이 - C++ (0) | 2021.09.05 |
[BOJ 2748] 백준 피보나치 수 2 풀이 - C++ (dynamic programming) (0) | 2021.08.31 |