๋ฐฑ์ค€ 1699 ํŒŒ์ด์ฌ

2022. 1. 7. 23:53ใ†๐Ÿ”ฑ Algorithm/DP

 

 

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

 

1699๋ฒˆ: ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ

์–ด๋–ค ์ž์—ฐ์ˆ˜ N์€ ๊ทธ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ œ๊ณฑ์ˆ˜๋“ค์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 11=32+12+12(3๊ฐœ ํ•ญ)์ด๋‹ค. ์ด๋Ÿฐ ํ‘œํ˜„๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, 11์˜ ๊ฒฝ์šฐ 11=22+22+12+12+12(5๊ฐœ ํ•ญ)๋„ ๊ฐ€๋Šฅํ•˜๋‹ค

www.acmicpc.net

 

 

์˜ค๋‹ต ์ฝ”๋“œ

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋ชจ๋‘ ๋งž์ท„๊ธธ๋ž˜ ์ •๋‹ต์ธ์ค„ ์ฐฉ๊ฐํ–ˆ๋‹ค.

from math import sqrt

N = int(input())

n = N
count = 0
while N > 0:
    if int(sqrt(n)) == sqrt(n):
        N -= n
        count += 1
        n = N
    else:
        n -= 1

print(count)

 

๋ฐ˜๋ก€๋Š” 12 ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ์ธ๋ฐ, ์œ„ ์ฝ”๋“œ์—์„  4๊ฐ€ ์ถœ๋ ฅ๋˜์ง€๋งŒ, ์ •๋‹ต์€ 3์ด๋‹ค.

2^2 + 2^2 + 2^2 = 12๊ฐ€ ๋˜๋Š” ๊ฒƒ์ธ๋ฐ, ์˜ค๋‹ต ์ฝ”๋“œ์—์„œ๋Š” 3^2 + 1^2 + 1^2 + 1^2 ๋กœ ์ธํ•ด 4๊ฐœ์˜ ์ˆ˜๊ฐ€ ๋”ํ•ด์ ธ 4๊ฐ€ ์ถœ๋ ฅ๋˜์–ด ์˜ค๋‹ต์ด ๋œ๋‹ค. 

์ด๋Ÿฐ ์˜ค๋‹ต์ด ๋ฐœ์ƒํ•˜๋Š” ์›์ธ์€, N์„ 1์”ฉ ์ค„์—ฌ๊ฐ€๋ฉด์„œ ์ œ๊ณฑ๊ทผ์„ ๊ตฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด ํฐ ์ˆ˜๋ถ€ํ„ฐ ์ œ๊ณฑ์ˆ˜๋ฅผ ๊ตฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, 12๊ฐ™์€ ๋ฐ˜๋ก€ ์ผ€์ด์Šค๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ์‹์˜ ์ ‘๊ทผ์œผ๋กœ๋Š” ๋‹ต์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค. 

 

 

 

์ •๋‹ต ์ฝ”๋“œ

N = int(input())

dp = [x for x 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])

 

dp ๋ผ๋Š” ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค. ์ด ๋ฐฐ์—ด์˜ ์ดˆ๊ธฐ ๋‚ด๋ถ€ ๊ฐ’์€ ๊ฐ ์ธ๋ฑ์Šค์™€ ๋™์ผํ•œ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

N ์ด๋ผ๋Š” ํƒ€๊ฒŸ ๋„˜๋ฒ„์˜ ์ œ๊ณฑ์ˆ˜๋ฅผ ๋ฐ”๋กœ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, 

N ๋ณด๋‹ค ์ž‘์€ ์ˆ˜ (i) ์˜ ์ œ๊ณฑ์ˆ˜๋ฅผ ๋จผ์ € ๊ตฌํ•˜๋ฉด์„œ N ๊นŒ์ง€ ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

 

์ •๋‹ต ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋ฆฌํŒฉํ† ๋ง ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

N = int(input())

dp = [x for x in range(N + 1)]
for i in range(1, N + 1):
    for j in range(1, i):
        if j * j > i:
            break
        dp[i] = min(dp[i], dp[i - j * j] + 1)    
        # if dp[i] > dp[i - j * j] + 1:
        #    dp[i] = dp[i - j * j] + 1
print(dp[N])

 

'๐Ÿ”ฑ Algorithm > DP' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 11055 ํŒŒ์ด์ฌ  (0) 2022.01.23
๋ฐฑ์ค€ 1912 ํŒŒ์ด์ฌ  (0) 2022.01.20
๋ฐฑ์ค€ 11053 ํŒŒ์ด์ฌ  (0) 2022.01.18
๋ฐฑ์ค€ 12852 ํŒŒ์ด์ฌ  (1) 2022.01.12
๋ฐฑ์ค€ 2293 ํŒŒ์ด์ฌ  (0) 2022.01.09