Algorithm๐Ÿฅ‡

1463.1๋กœ๋งŒ๋“ค๊ธฐ

hae02y 2023. 11. 1. 00:35
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์ •์ˆ˜ X์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ธ ๊ฐ€์ง€ ์ด๋‹ค.

  1. X๊ฐ€ 3์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 3์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
  2. X๊ฐ€ 2๋กœ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋ฉด, 2๋กœ ๋‚˜๋ˆˆ๋‹ค.
  3. 1์„ ๋บ€๋‹ค.

์ •์ˆ˜ N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์œ„์™€ ๊ฐ™์€ ์—ฐ์‚ฐ ์„ธ ๊ฐœ๋ฅผ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์„œ 1์„ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค. ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

## ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 106๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค.

## ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ๋ฆ„

์ด ๋ฌธ์ œ๋Š” ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•ด์•ผํ•œ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ์œ„ํ•ด 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋ณผ์ˆ˜์žˆ๋‹ค.

  • 3์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ
  • 2๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ
  • 1์„ ๋นผ๋Š” ๊ฒฝ์šฐ
    • 6์œผ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ

์ฆ‰, 6์œผ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ๋Š” 3์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ์™€ 2๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ, 1์„ ๋นผ๋Š” ๊ฒฝ์šฐ ๋ชจ๋‘ ์žฌ๊ท€ํ˜ธ์ถœ ํ•˜์—ฌ 3๊ฐ€์ง€ ๊ฒฝ์šฐ ์ค‘ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ DP๋ฅผ ๊ฐฑ์‹ 

3์œผ๋กœ๋งŒ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ๋Š” 3์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ์™€ 1์„ ๋นผ๋Š” ๊ฒฝ์šฐ๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœ

2๋กœ๋งŒ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ๋Š” 2๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒฝ์šฐ์™€ 1์„ ๋นผ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์žฌ๊ท€ํ˜ธ์ถœ

๊ทธ ์™ธ์—๋Š” 1์„ ๋นผ๋Š” ๊ฒฝ์šฐ๋งŒ ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ๋ถ€๋ถ„์— ์ด์ „ ์žฌ๊ท€ ํ˜ธ์ถœ ์ค‘ ์ตœ์†Ÿ๊ฐ’์— 1์„ ๋”ํ•œ ๊ฐ’์ด ํ˜„์žฌ N์— ๋Œ€ํ•œ ์ตœ์†Œ ์—ฐ์‚ฐํšŸ์ˆ˜๊ฐ€ ๋œ๋‹ค.

์ด๋ฅผ dp ๋ฐฐ์—ด์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ํ•˜๋ฉด์„œ ๊ฐ’์„ ๊ตฌํ•ด ๋‚˜๊ฐ„๋‹ค.

์ฝ”๋“œ

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

public class _1๋กœ๋งŒ๋“ค๊ธฐ {  

    static Integer[] dp;  

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

        int n = Integer.parseInt(br.readLine());  

        dp = new Integer[n+1];  

        dp[0] = dp[1] = 0;  

        System.out.println(recursion(n));  
        br.close();  

    }  

    static int recursion(int n){  

        if(dp[n] == null){  
          //6์œผ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ  
            if(n % 6 == 0){  
                dp[n] = Math.min(recursion(n-1), Math.min(recursion(n/3), recursion(n/2)))+1;  
            } 
            //3์œผ๋กœ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ
            else if (n % 3 == 0) {  
                dp[n] = Math.min(recursion(n/3), recursion(n-1))+1;  
            } 
            //2๋กœ ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ
            else if (n % 2 == 0) {  
                dp[n] = Math.min(recursion(n/2), recursion(n-1))+1;  
            }
            //์•ˆ๋‚˜๋ˆ ์ง€๋Š” ๊ฒฝ์šฐ
            else {  
                dp[n] = recursion(n-1)+1;  
            }  
        }  

        return dp[n];  
    }  
}

๋‹ค๋ฅธ๋ฐฉ๋ฒ•

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int N = in.nextInt();
        System.out.println(recur(N, 0));
    }

    static int recur(int N, int count) {
        // N์ด 2 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ ๋ˆ„์ ๋œ count๊ฐ’์„ ๋ฐ˜ํ™˜
        if (N < 2) {
            return count;
        }
        return Math.min(recur(N / 2, count + 1 + (N % 2)), recur(N / 3, count + 1 + (N % 3)));

    }
}

๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด n-1์˜ ๊ฐ’๋„ ์žฌ๊ท€ํ˜ธ์ถœํ•˜์ง€๋งŒ, ๋‚˜๋จธ์ง€๊ฐ’์„ ์ด์šฉํ•˜์—ฌ count๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด ํšจ์œจ์ด ์ข€๋” ์ข‹๋‹ค.

๋ฐ˜์‘ํ˜•