우규이인우윀
Eager To Learn 🌌
우규이인우윀
전체 방문자
였늘
μ–΄μ œ

λΈ”λ‘œκ·Έ 메뉴

  • 🏑 ν™ˆ
  • πŸš€ κΉƒν—ˆλΈŒ
  • β›… νƒœκ·Έ ν΄λΌμš°λ“œ
  • λΆ„λ₯˜ 전체보기 (217)
    • πŸ‘¨πŸ»‍πŸ’» PS (170)
      • JAVA (82)
      • MYSQL (1)
      • Docker (2)
      • PYTHON (24)
      • LeetCode 150 (39)
      • Algorithm 기법 (1)
      • 바킹독 (21)
    • λΈ”λ‘œκ·Έ 이사 (0)
    • Error (1)
    • CS (15)
      • DataBase (2)
      • OS (7)
      • Network (1)
      • Spring (1)
      • 자료ꡬ쑰 (3)
      • Java (1)
    • Learned (7)
      • Spring (7)
    • κ°œλ°œμ„œμ  (15)
      • 가상 λ©΄μ ‘ μ‚¬λ‘€λ‘œ λ°°μš°λŠ” λŒ€κ·œλͺ¨ μ‹œμŠ€ν…œ 섀계 기초 (1)
      • 였브젝트 - 쑰영호 (7)
      • μΉœμ ˆν•œ SQL νŠœλ‹ (7)
    • 회고 (2)
hELLO Β· Designed By μ •μƒμš°.
우규이인우윀

Eager To Learn 🌌

πŸ‘¨πŸ»‍πŸ’» PS/JAVA

[JAVA] λ°±μ€€ 1463번 【1둜 λ§Œλ“€κΈ°γ€‘

2022. 9. 2. 15:20


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]);
    }
}
    'πŸ‘¨πŸ»‍πŸ’» PS/JAVA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • [JAVA] λ°±μ€€ 11727번 【2×n 타일링 2】
    • [JAVA] λ°±μ€€ 11726번 【2×n 타일링】
    • [JAVA] λ°±μ€€ 2522번 【별 찍기 - 12】
    • [JAVA] λ°±μ€€ 1924번 【2007년】
    우규이인우윀
    우규이인우윀
    개발자 κΏˆλ‚˜λ¬΄

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”