알고리즘

[백준 알고리즘] 1699번 제곱합. 파이썬(python)

삶은겨란 2022. 7. 17. 18:43

오답)

틀린 이유: n보다 작은 제곱값 중 제일 큰 수를 빼는 것을 반복하면 최소가 나올 줄 알았다.

예제로 나온 값들도 결과가 맞았었다.

그런데 52와 같은 반례를 보니 틀린 것을 알 수 있었다.

52=49+1+1+1 로 큰수를 빼면 정답이 4이지만,

52=36+16으로 계산하면 2번만에 구할 수 있다.

따라서 dp를 사용해 각 값의 최소연산 수를 구해야 한다.

import sys
input=sys.stdin.readline

n=int(input())
sq=[i*i for i in range(1,318)]
cnt=0
while n!=0:
    for i in range(len(sq)):
        if sq[i]>n: # 작은값 중에 제일 큰 값
            n=n-sq[i-1]
            cnt+=1
            break
print(cnt)

 

정답)

import sys
input=sys.stdin.readline

n=int(input())
sq=[i*i for i in range(1,318)]
dp=[0]*(n+1)

for i in range(1,n+1):
    s=[]
    for j in sq:
        if j>i:
            break
        s.append(dp[i-j])
    dp[i]=min(s)+1

print(dp[n])