๐ฉ๐ป๐ป ์๊ณ ๋ฆฌ์ฆ/๋ฐฑ์ค
[๋ฐฑ์ค] 1699๋ฒ ์ ๊ณฑ์์ ํฉ
mallin
2025. 2. 13. 18:12
https://www.acmicpc.net/problem/1699
๐ ๋ฌธ์

๐ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ฐ์ N์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100,000)
๐ ์ถ๋ ฅ
์ฃผ์ด์ง ์์ฐ์๋ฅผ ์ ๊ณฑ์์ ํฉ์ผ๋ก ๋ํ๋ผ ๋์ ๊ทธ ์ ๊ณฑ์ ํญ์ ์ต์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ํ์ด ๋ฐฉ์
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ๋๋ฐ ์๊ฐ๋ณด๋ค ์ค๋ ๊ฑธ๋ฆฐ ๋ฌธ์ ์ ๋๋ค ๐ฅน
(1) ์ ๊ณฑ์๋ค์ ๋ฐฐ์ด์ ๋ง๋ค๊ธฐ
(2) ๊ฐ ์ซ์ n ์ ๋ํด ๊ฐ์ฅ ์ ์ ์ ๊ณฑ์์ ํฉ์ผ๋ก ํํํ๋ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค
* ํ์ฌ ์ซ์ n ๋ณด๋ค ์ ์ ์ ๊ณฑ์ ์ค์์ dp[n-์ ๊ณฑ์] + 1 ์ด ๊ฐ์ฅ ์ ์ ๊ฒฝ์ฐ๋ก ์ ๋ฐ์ดํธ
(3) N ์ ์ต์ ์ ๊ณฑ์ ๊ฐ์๋ฅผ ์ถ๋ ฅ
๐ ์ฝ๋
N = int(input())
dp = [0 for _ in range(N + 1)]
squares = []
for n in range(1, N+1):
if n ** 2 <= N:
dp[n ** 2] = 1
squares.append(n ** 2)
if n <= 3:
dp[n] = n
elif dp[n] == 0:
m = dp[n-1] + 1
for square in squares:
if square > n:
break
m = min(m, dp[n-square] + 1)
dp[n] = m
print(dp[-1])
