BOJ 1463. 1로만들기

2 minute read

BOJ 1463. 1로 만들기

image

풀이

d[n]= 1로 만드는 연산을 하는 최솟값

점화식
d[n] = min(d[n-1] +1 , d[n2] + 1, d[n3] + 1 ) 

대략적인 논리로, 그대로 쓰지는 않고
2나 3으로 나누어 떨어지는지 확인 조건문으로 처리 필요

Bottom-Up

입력이 1일때는 어떠한 연산도 할 필요가 없으므로
d[1]에 0을 넣어 시작한다.

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

class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int[] d = new int[10000001];
        int n = sc.nextInt();

        d[1] = 0;
        for (int i = 2; i <= n; i++) {
            d[i] = d[i - 1] + 1;
            if (i % 2 == 0 && d[i] > d[i / 2] + 1) {
                d[i] = d[i / 2] + 1;
            }
            if (i % 3 == 0 && d[i] > d[i / 3] + 1) {
                d[i] = d[i / 3] + 1;
            }
        }
        System.out.println(d[n]);
        sc.close();
    }
}
fun main() {
    val d = IntArray(1000001) { 0 }
    val n = readLine()!!.toInt()

    d[1] = 0
    (2..n).forEach { i ->
        d[i] = d[i - 1] + 1

        if (i % 2 == 0 && d[i] > d[i / 2] + 1) {
            d[i] = d[i / 2] + 1
        }

        if (i % 3 == 0 && d[i] > d[i / 3] + 1) {
            d[i] = d[i / 3] + 1
        }
    }

    println(d[n])
}

Top-Down

import java.util.Scanner;

class Main {
    static int[] d = new int[1000001];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(go(n));
    }

    static int go(int i) {
        if (i == 1) return 0;
        if (d[i] > 0) return d[i];

        d[i] = go(i - 1) + 1;

        if (i % 2 == 0) {
            int temp = go(i / 2) + 1;
            if (d[i] > temp) d[i] = temp;
        }

        if (i % 3 == 0) {
            int temp = go(i / 3) + 1;
            if (d[i] > temp) d[i] = temp;
        }
        return d[i];
    }
}
val d = IntArray(1000001) { 0 }

fun main() {
    println(go(readLine()!!.toInt()))
}

fun go(i: Int): Int {
    if (i == 1) return 0
    if (d[i] > 0) return d[i]

    d[i] = go(i - 1) + 1
    if (i % 2 == 0) (go(i / 2) + 1).let { if (d[i] > it) d[i] = it }
    if (i % 3 == 0) (go(i / 3) + 1).let { if (d[i] > it) d[i] = it }

    return d[i]
}

풀이소스

github.com/beomjo/algorithm-study/blob/main/BOJ/java/1463.java github.com/beomjo/algorithm-study/blob/main/BOJ/kotlin/1463.kt