๐Ÿงท ๋ฌธ์ œ

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

์ฃผ์–ด์ง„ ์ž์—ฐ์ˆ˜ N์„ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ์— ๊ทธ ํ•ญ์˜ ์ตœ์†Œ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๐Ÿ›  ํ’€์ด

์ด ๋ฌธ์ œ๋Š” Bottom-Up ๋ฐฉ์‹์˜ DP๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

Step 1.
 ๋จผ์ € DP table์„ ๊ธธ์ด n์˜ 1์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋ชจ๋“  ํ•ญ์€ ์ตœ๋Œ€ i์˜ ๊ธธ์ด๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ (1+1+1+...+1) ๊ฐ’์€ i๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.
d = [i for i in range(n+1)]

Step 2.
 ์ฃผ์–ด์ง„ ์ˆซ์ž๊ฐ€ ์ œ๊ณฑ์ˆ˜๋ผ๋ฉด ์ œ๊ณฑ์ˆ˜ ํ•ญ์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ 1์ด๋ฏ€๋กœ, 1๋ถ€ํ„ฐ i๊นŒ์ง€ ์ œ๊ณฑ์ˆ˜๋“ค์„ ๋นผ๊ฐ€๋ฉด์„œ ๋บ€ ์ˆซ์ž + 1๊ณผ ๊ธฐ์กด์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋‹ต์„ ๊ตฌํ•ด์ค€๋‹ค.
if dp[i] > dp[i - j*j] + 1: dp[i] = dp[i - j*j] + 1

Step 3.
 ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ•ด์ง„ DP table์˜ n๋ฒˆ์งธ ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ–Š ๋‚˜์˜ ์ฝ”๋“œ

import sys

input = sys.stdin.readline

if __name__ == "__main__":
    n = int(input())
    dp = [i for i in range(n+1)]
    for i in range(1, n+1):
        for j in range(1, i):
            if j*j > i:
                break
            if dp[i] > dp[i - j*j] + 1:
                dp[i] = dp[i - j*j] + 1

    print(dp[n])