BOJ 1699. 제곱수의 합

1 minute read

BOJ 1699. 제곱수의 합

image

풀이

d[i] = i을 제곱수의 합으로 나타낼 수 있는 최소 항의 개수

마지막으로 올 수 있는 수들은 11, 22, 33….. jj이다.
즉 , O+O+O+O+…. (j*j) = i 으로 표현된다.

(i - jj) + (jj) = i로 표현할 수 있고, 마지막  j*j는 한 가지 방법이므로 +1이다.
(i - j*j) + 1 이다.

점화식
d[i] = min(d[i - jj ]) +1 즉, d[i] = min(d[i], d[i - jj] +1)
1 <= j <= i

import java.io.IOException;
import java.util.Scanner;

class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] d = new int[n + 1]; // 최소항의 개수

        for (int i = 1; i <= n; i++) {
            d[i] = i;
            for (int j = 1; j * j <= i; j++) {
                d[i] = Math.min(d[i], d[i - j * j] + 1);
            }
        }

        System.out.println(d[n]);
    }
}
import kotlin.math.min

fun main() {
    val n = readLine()!!.toInt()
    val d = IntArray(n + 1)

    for (i in 1..n) {
        d[i] = i
        var j = 1
        while (j * j <= i) {
            d[i] = min(d[i], d[i - j * j] + 1)
            j++
        }
    }
    println(d[n])
}

풀이소스

github.com/beomjo/algorithm-study/commit/84ff043e04486adc457340873afd4aac6e3aa44c