코딩테스트/백준

[백준]1463번 1로 만들기 - Java

GAEBAL 2022. 3. 31. 23:47
728x90

문제

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

 

1463번: 1로 만들기

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

www.acmicpc.net

 

 

풀이

흔한 DP 유형의 문제임

하향식, 상향식 두 가지 방식으로 풀었음!

 

처음 생각하는 방식이 좀 어렵고 떠올리기만 하면 쉽게 풀 수 있는 듯???

 

 

코드

// 1463번 1로 만들기 [DP(동적계획법) - 1로 만들기 문제]
// https://www.acmicpc.net/problem/1463

package BAEKJOON;

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

public class Num1463_1로만들기 {
    private static class Solution {

        // 탑 다운 방법
        private int solution1(int N) {
            int dp[] = new int[N + 2];

            if (N == 1) {
                return 0;
            }
            if (dp[N] > 0) {
                return dp[N];
            }
            dp[N] = solution1(N - 1) + 1;
            if (N % 6 == 0) {
                dp[N] = Math.min(solution1(N - 1), Math.min(solution1(N / 3), solution1(N / 2))) + 1;
            }
            if (N % 2 == 0) {
                dp[N] = Math.min(dp[N], solution1(N / 2) + 1);
            }
            if (N % 3 == 0) {
                dp[N] = Math.min(dp[N], solution1(N / 3) + 1);
            }

            return dp[N];
        }

        // 바텀 업 방법
        private int solution2(int N) {
            int dp[] = new int[N + 2];

            dp[1] = 0;
            for (int i = 2; i <= N; i++) {
                dp[i] = dp[i - 1] + 1;
                if (dp[i] % 2 == 0 && dp[i] > dp[i / 2] + 1) {
                    dp[i] = dp[i / 2] + 1;
                }
                if (dp[i] % 3 == 0 && dp[i] > dp[i / 3] + 1) {
                    dp[i] = dp[i / 3] + 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());

        Solution s = new Solution();
        System.out.println(s.solution1(N));
        System.out.println(s.solution2(N));
    }
}
 
728x90