Dynamic Programingμ μ¬μ©νλ λ¬Έμ μ΄λ€.
λ¨Όμ , λ©λͺ¨μ΄μ μ΄μ ν΄λ dp[ ] λ°°μ΄μ μμ±νλ€.
dp[n]μ μλ―Έλ nμμ 1λ‘ λ³νν λ λλ μ΅μμ μ°μ°μλ₯Ό μ μ₯ν κ²μ΄λ€.
λ¨Όμ dp[0] κ³Ό dp[1] μ κ°μ΄ 0 μμ λͺ νν μ¬μ€μ΄κ³ , dp[2]λΆν° 쑰건문μ μ΄μ©ν΄ μ μλ₯Ό νλ€.
2λ₯Ό 1λ‘ λ§λλ νμμ μ΅μκ°μ 무μμΌκΉ.
λ¨Όμ 2κ°μ§ μ°μ°μ μ§νν μ μλ€. 1μ λΉΌκ±°λ, 2λ₯Ό λλλ κ²
2-1 = 1 μ΄λ―λ‘ dp[2]=dp[1]+1=0+1=1
2/2=1 μμ, dp[2]=dp[1]+1=0+1=1μ΄λ€.
λλ€ κ°μ΄ 1μ΄λ―λ‘ λ μ°μ°μ μ΅μκ°μ 1μ΄λ€.
2μμ 1λ‘ λ§λλ μ°μ°μ μ΅μκ°μ 1μ΄λ―λ‘, dp[2]=1μ κΈ°λ‘νλ€.
3μ 1λ‘ λ§λλ νμμ μ΅μκ°μ?
3μ 1μ λΉΌκ±°λ 3μ λλλ κ² λκ°μ§ μ°μ°μ μνν μ μλ€.
3-1μ 2κ° λκ³ 2μμ 1λ‘ λ§λλ μ΅μ μ°μ°μλ μ κ³Όμ μ ν΅ν΄ μ΄λ―Έ 1μΈκ²μ μκ³ μμΌλ―λ‘
dp[3]=dp[2]+1=1+1=2κ° λλ€.
3μΌλ‘ λλλ μ°μ°μ μννλ©΄ 3/3= 1μ΄ λκ³
dp[3]=dp[1]+1=0+1=1μ΄ λλ€.
μ¦, λ μ°μ°μ λΉκ΅ν΄λ΄€μλ, 3μΌλ‘ λλλ κ²½μ°κ° 2λ³΄λ€ μμ 1μΈ κ²½μ°κ° μ‘΄μ¬νλ―λ‘ dp[3]=1μ κΈ°λ‘νλ€.
4λ₯Ό 1λ‘ λ§λλ νμμ μ΅μκ°μ?
4λ 1μ λΉΌκ±°λ 2λ‘ λλλ λκ°μ§ μ°μ°μ μνν μ μλ€.
4-1=3μ΄ λκ³ 3μμ 1λ‘ λ§λλ μ΅μμ νμλ dp[3]=1μ΄λ―λ‘ dp[4]=dp[3]+1=1+1=2κ° λλ€.
4/2=2κ° λλ―λ‘ 2μμ 1λ‘ λ§λλ μ΅μμ νμλ dp[2]=1μ΄λ―λ‘, dp[4]=dp[2]+1=1+1=2κ° λλ€.
λλ€ 2λ²μ νμκ° μμλκΈ° λλ¬Έμ dp[4]=2κ° λλ€.
6μ κ²½μ°μλ, dp[5](1μ λΊ κ²½μ°) μ dp[3] (2λ‘ λλ κ²½μ°) κ³Ό dp[2] (3μΌλ‘ λλ κ²½μ°) λ₯Ό λΉκ΅νμ¬ μ΄ μΈκ°μ§ κ° μ€ μ΅μκ°μ 1μ λν κ°μ΄ dp[6]μ΄ λ κ²μ΄λ€.
μ΄λ° λ°©λ²μΌλ‘ μ λ ₯λ°μ XκΉμ§ μ°μ°μ μννμ¬ dpλ₯Ό μ±μ°λ κ²μ΄λ€.
X κ° λ―Έλ§μΌλ‘ dpκ°μ λ€ μ±μλ¨κΈ° λλ¬Έμ, dp[X-1] κ³Ό dp[X/3] κ³Ό dp[X/2]λ₯Ό λΉκ΅νμ¬ κ·Έ μ€ μμ κ°μ +1 ν κ°μ΄ μ΅μμ μ°μ° νμκ° λ κ²μ΄λ€.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int X = scanner.nextInt();
int [] dp = new int[X+1];
dp[0]=0;
dp[1]=0;
for(int i=2;i<=X;i++) {
dp[i] =dp[i-1]+1;
if(i%2==0)
dp[i]=Math.min(dp[i],dp[i/2]+1);
if(i%3==0)
dp[i]=Math.min(dp[i],dp[i/3]+1);
}
System.out.println(dp[X]);
}
}