๐งท ๋ฌธ์
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])