[백준] #1463 1로 만들기

cool_kim·2021년 4월 25일
0

BOJ

목록 보기
4/4


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

📃 문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.
    정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

📥 입력

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

📤 출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

💡 접근

  • DP를 사용하면 쉽게 풀 수 있을 거라고 생각
  • 큰 수 부터 나눠주면 될거라고 생각했는데 그렇지 않았음..
    • 10/2 -> 5/2 -> 4/2 -> 2-1 = 1
    • 10-1 -> 9/3 -> 3/3 = 1

    📍 코드

    import java.io.*;
    
    public class B1463 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int n = Integer.parseInt(br.readLine());
            int d[] = new int[n+1];
            d[0] = 0;
            d[1] = 0;
            for (int i = 2; i <= n; i++){
                d[i] = d[i-1] + 1;
                if (i % 2 == 0) d[i] = Math.min(d[i], d[i/2] + 1);
                if (i % 3 == 0) d[i] = Math.min(d[i], d[i/3] + 1);
            }
            System.out.println(d[n]);
            br.close();
            
         }
    }
    profile
    FE developer

    0개의 댓글