๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[๋ฐฑ์ค€] 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])