ν•΄λ²„λ‹ˆ 2023. 12. 1. 14:34
λ°˜μ‘ν˜•

 

 

 

문제 

https://www.acmicpc.net/problem/1463

 

1463번: 1둜 λ§Œλ“€κΈ°

첫째 쀄에 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 106보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜ N이 주어진닀.

www.acmicpc.net

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

풀이

 

dp[n] = Math.min(recur(n / 3), recur(n - 1)) + 1;

μ΄λ ‡κ²Œ 적지 μ•Šκ³ 

 

dp[n] = Math.min(recur(n - 1), recur(n / 3)) + 1;

 

μ΄λ ‡κ²Œ recur(n - 1)이 μ•žμ— μ˜¨λ‹€λ©΄, 0λΆ€ν„° n - 1κΉŒμ§€ λͺ¨λ‘ νƒμƒ‰λ˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„ μ΄ˆκ³Όκ°€ λœλ‹€.

κ·Έλž˜μ„œ μš°μ„  recur(n / 3)μ΄λ‚˜ recur(n / 2) 을 λ¨Όμ € ν•΄μ„œ 뢀뢄을 λ©”λͺ¨μ΄μ œμ΄μ…˜μ„ ν•œ λ‹€μŒ, recur(n - 1)을 ν•΄μ£Όλ©΄ 이미 νƒμƒ‰ν•œ 뢀뢄이 있으면 κ·Έ 값이 λ°˜ν™˜λ˜λ―€λ‘œ 탐색이 덜 걸리게 λœλ‹€. 

 

 

λ©”λͺ¨μ΄μ œμ΄μ…˜(memoization)μ΄λž€?

컴퓨터 ν”„λ‘œκ·Έλž¨μ΄ λ™μΌν•œ 계산을 λ°˜λ³΅ν•΄μ•Ό ν•  λ•Œ, 이전에 κ³„μ‚°ν•œ 값을 λ©”λͺ¨λ¦¬μ— μ €μž₯ν•¨μœΌλ‘œμ¨ λ™μΌν•œ κ³„μ‚°μ˜ 반볡 μˆ˜ν–‰μ„ μ œκ±°ν•˜μ—¬ ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 속도λ₯Ό λΉ λ₯΄κ²Œ ν•˜λŠ” 기술

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    static Integer[] dp;

    public int recur(int n) {
        if (dp[n] == null) {
            if (n % 6 == 0) {
                dp[n] = Math.min(recur(n - 1), Math.min(recur(n / 3), recur(n / 2))) + 1;
            } else if (n % 3 == 0) {
                dp[n] = Math.min(recur(n / 3), recur(n - 1)) + 1;
            } else if (n % 2 == 0) {
                dp[n] = Math.min(recur(n / 2), recur(n - 1)) + 1;
            } else {
                dp[n] = recur(n - 1) + 1;
            }
        }
        return dp[n];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        Main m = new Main();
        dp = new Integer[n + 1];
        dp[0] = dp[1] = 0;
        int answer = m.recur(n);
        System.out.println(answer);
    }
}

 

 

 

 

 

 

 

 

 

μ •λ‹΅ 

 

 

 

 

 

 

 

λ°˜μ‘ν˜•