λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 1463 1둜 λ§Œλ“€κΈ°

by 🍊귀🍊 2024. 7. 27.

문제 

문제 링크 https://www.acmicpc.net/problem/1463

  • μ •μˆ˜ X에 μ‚¬μš©ν•  수 μžˆλŠ” 연산은 λ‹€μŒκ³Ό 같이 μ„Έ 가지 이닀.
    1. Xκ°€ 3으둜 λ‚˜λˆ„μ–΄ 떨어지면, 3으둜 λ‚˜λˆˆλ‹€.
    2. Xκ°€ 2둜 λ‚˜λˆ„μ–΄ 떨어지면, 2둜 λ‚˜λˆˆλ‹€.
    3. 1을 λΊ€λ‹€.
  • μ •μˆ˜ N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μœ„μ™€ 같은 μ—°μ‚° μ„Έ 개λ₯Ό 적절히 μ‚¬μš©ν•΄μ„œ 1을 λ§Œλ“€λ €κ³  ν•œλ‹€. 연산을 μ‚¬μš©ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜μ‹œμ˜€.
  • 첫째 쀄에 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 106보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜ N이 주어진닀.
  • 첫째 쀄에 연산을 ν•˜λŠ” 횟수의 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

아이디어

  • μ—°μ‚° 횟수λ₯Ό μ €μž₯ν•  배열을 λ§Œλ“€μ–΄μ„œ 1, 2, 3을 μ΄ˆκΈ°κ°’μœΌλ‘œ μ €μž₯ν•œλ‹€.
  • 1은 μ—°μ‚°νšŸμˆ˜κ°€ 0, 2λŠ” μ—°μ‚°νšŸμˆ˜κ°€ 1, 3은 μ—°μ‚°νšŸμˆ˜κ°€ 1둜 μ €μž₯ν•œλ‹€.
  • 4λΆ€ν„° NκΉŒμ§€ λ°˜λ³΅λ¬Έμ„ λŒλ¦¬λ©΄μ„œ 값을 μ €μž₯ν•˜λŠ”λ°, forλ¬Έ μ‹œμž‘ν• λ•Œ i번째 배열값을 i-1번째 λ°°μ—΄κ°’ + 1둜 μ €μž₯ν•œλ‹€. (iμ—μ„œ 1을 λΉΌλ©΄ i-1이 λ˜λ―€λ‘œ)
  • 그리고 λ§Œμ•½ iκ°€ 3으둜 λ‚˜λˆ„μ–΄ 떨어지면 iλ₯Ό 3으둜 λ‚˜λˆˆ λ°°μ—΄κ°’μ—μ„œ 1 λ”ν•œ κ°’κ³Ό ν˜„μž¬κ°’ 그리고 i-1번째 λ°°μ—΄ κ°’μ—μ„œ 1 λ”ν•œ 값쀑 제일 μž‘μ€ 값을 i번째 배열에 μ €μž₯ν•œλ‹€.
  • κ·Έ λ’€ iκ°€ 2둜 λ‚˜λˆ„μ–΄ 떨어진닀면  iλ₯Ό 2둜 λ‚˜λˆˆ λ°°μ—΄κ°’μ—μ„œ 1 λ”ν•œ κ°’κ³Ό ν˜„μž¬κ°’ 그리고 i-1번째 λ°°μ—΄ κ°’μ—μ„œ 1 λ”ν•œ κ°’ 쀑 제일 μž‘μ€ 값을 i번째 배열에 μ €μž₯ν•œλ‹€.

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • X

DP 문제인 것 κ°™μ§€λ§Œ λ‚˜λ¦„..? 잘 ν‘Όκ±° κ°™μ•„μ„œ λ§Œμ‘±μŠ€λŸ½λ‹€..!!

μ½”λ“œ

import java.util.*;
import java.io.*;

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

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

        // μ—°μ‚° 횟수 μ €μž₯
        int arr[] = new int[N + 1];

        // 1, 2, 3μΌλ•Œ μ΄ˆκΈ°κ°’λ“€ μ €μž₯
        arr[1] = 0;

        if(N > 1){
            arr[2] = 1;
        }

        if(N > 2){
            arr[3] = 1;
        }

        for(int i = 4; i <= N; i++){
            // i번째 값을 μ „ λ°°μ—΄ 값에 1을 λ”ν•œ κ°’μœΌλ‘œ μ €μž₯
            arr[i] = arr[i - 1] + 1;

            // 3으둜 λ‚˜λˆ„μ–΄ 떨어진닀면
            if(i % 3 == 0){
                // 3으둜 λ‚˜λˆˆ κ°’μ—μ„œ 1을 λ”ν•œ κ°’κ³Ό
                // ν•΄λ‹Ή 값보닀 1μž‘μ€ κ°’μ—μ„œ 1 λ”ν•œ κ°’ 쀑
                // 더 μž‘μ€ 값을 ν•΄λ‹Ή λ°°μ—΄ κ°’κ³Ό 비ꡐ해 더 μž‘μ€ 값을 μ €μž₯
                arr[i] = Math.min(Math.min(arr[i / 3] + 1, arr[i - 1] + 1), arr[i]);
            }

            // 2둜 λ‚˜λˆ„μ–΄ 떨어진닀면
            if(i % 2 == 0){
                // 2으둜 λ‚˜λˆˆ κ°’μ—μ„œ 1을 λ”ν•œ κ°’κ³Ό
                // ν•΄λ‹Ή 값보닀 1μž‘μ€ κ°’μ—μ„œ 1 λ”ν•œ κ°’ 쀑
                // 더 μž‘μ€ 값을 ν•΄λ‹Ή λ°°μ—΄ κ°’κ³Ό 비ꡐ해 더 μž‘μ€ 값을 μ €μž₯
                arr[i] = Math.min(Math.min(arr[i / 2] + 1, arr[i - 1] + 1), arr[i]);
            }

        }

        System.out.println(arr[N]);
    }
}