π£ λ¬Έμ μ΄ν΄
1. Xκ° 3μΌλ‘ λλμ΄ λ¨μ΄μ§λ©΄, 3μΌλ‘ λλλ€.
2. Xκ° 2λ‘ λλμ΄ λ¨μ΄μ§λ©΄, 2λ‘ λλλ€.
3. 1μ λΊλ€.
4, μ μ Nμ΄ μ£Όμ΄μ‘μ λ, μμ κ°μ μ°μ° μΈ κ°λ₯Ό μ΄μ©νμ¬ 1μ λ§λ€κ³ μ νλ€.
μ΄λ, νμν μ°μ° νμμ μ΅μκ°μ ꡬνλ κ²μ΄ λͺ©νμ΄λ€.
λμ κ³νλ²(Dynamic Programming) λ°©μμ μ¬μ©νλ€.
π νμ΄ κ³Όμ
λ°ν
μ
(Bottom-Up) λ°©μμΌλ‘ ꡬννλ€. (λ€λ₯Έ λΆλ€ νμ΄λ₯Ό 보λ, νλ€μ΄ λ°©μλ μκ³ λ€μνλ€.. λλΉΌκ³ λ€μ²μ¬μΈλ―...)
μ λ ₯ κ°μ μ΅λκ° 106 (1,000,000) μ΄λ―λ‘ ν¬κΈ°κ° 100λ§μ΄κ³ κ° μμλ₯Ό 100λ§μΌλ‘ μ΄κΈ°νν int ν 벑ν°λ₯Ό μ¬μ©νλ€.
λ²‘ν° λ΄λΆ κ° μμλ κ·Έ μΈλ±μ€ λ²νΈμ ν΄λΉνλ μ«μμ μ°μ° νμλ₯Ό κ°μΌλ‘ κ°μ§κ³ μλ€.
(map[i]λ νμ¬ κΈ°μ€ μ«μ iμ μ°μ° νμ)
iλ²μ§Έ μΈλ±μ€λΆν° μ§ννλ©΄μ i+1, i*2, i*3 μ κΈ°μ‘΄ μ°μ° νμλ³΄λ€ λ μμ κ²½μ° λ체νλ λ°©μμ΄λ€.
κ²°κ³Όμ μΌλ‘ map 벑ν°μλ κ° μΈλ±μ€ λ²νΈμ ν΄λΉνλ μ«μμ μ΅μ μ°μ° νμκ° κΈ°λ‘λλ€.
μμ± μΈμ΄: C++
#include <cstdio>
#include <vector>
using namespace std;
int main(){
int num = 0;
vector<int> map(1000001, 1000000);
map[0] = 0;
map[1] = 0;
// map[i]λ νμ¬ κΈ°μ€ μ«μ iμ μ°μ° νμ
for (int i = 1; i < map.size(); ++i) {
int operCnt = map[i] + 1; // νμ¬ μ«μμ μ°μ° νμμ 1μ λν¨(+1, *2, *3 λͺ¨λ μ°μ°μ ν λ² λ νλ κ²μ΄λ―λ‘)
/********* +1 νλ κ²½μ° *********/
// i+1μ κΈ°μ‘΄ μ°μ° νμλ³΄λ€ λ μμ κ²½μ° λ체
if(i+1 <= map.size() && operCnt < map[i+1]) map[i+1] = operCnt;
/********* *2 νλ κ²½μ° *********/
// i*2μ κΈ°μ‘΄ μ°μ° νμλ³΄λ€ λ μμ κ²½μ° λ체
if(i*2 <= map.size() && operCnt < map[i*2]) map[i*2] = operCnt;
/********* *3 νλ κ²½μ° *********/
// i*3μ κΈ°μ‘΄ μ°μ° νμλ³΄λ€ λ μμ κ²½μ° λ체
if(i*3 <= map.size() && operCnt < map[i*3]) map[i*3] = operCnt;
}
scanf("%d", &num);
printf("%d\n", map[num]);
return 0;
}
π λ°°μ΄ μ
DP λ¬Έμ νμ΄μ μμμ΄λ€..!
μ΄μ¨λ―Έ ν΄λ΄μΌκ² λ€!!! πΆ