STUDY/Python 알고리즘

[백준] 1699번 제곱수의 합

Ojungii 2024. 5. 9. 18:17

 

제곱수의 합들을 구해보면 다음과 같습니다.

1 : 1
2: 1 + 1
3: 1 + 1 + 1
4: 4
5: 4 + 1
6: 4 + 1 + 1
7: 4 + 1 + 1 + 1
8: 4 + 4
9 : 9
10: 9 + 1
11: 9 + 1 + 1
12: 4 + 4 + 4

 

시도 : 실패

- 재귀함수 사용

- N보다 작거나 같은 제곱수를 빼면서 카운팅

- 반례 존재 : 12( 9+1+1+1)로 나오지만 최소개수는 3개(4+4+4)

- 시도방법은 최소개수가 아닌 단순히 제곱수들의 합으로 나타내기만 한 것

import sys
sys.setrecursionlimit(100000)

def cal_func(n, cnt):
    num = int(n**0.5)
    rest = n - (num**2)
    cnt +=1
    if rest == 0 :
        print(cnt)
    else :
        cal_func(rest,cnt)
        
n = int(input())        
cal_func(n,0)

 

 

올바른 접근법

- DP 활용

- 결과의 규칙성을 활용

- 제곱수일때는 dp[i] = 1

- 나머지는 dp[i] = dp[i-j*j] +1

- ex) 12일때 min(dp[12 -1], dp[12-4], dp[12-9]) + 1

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])

 

 

규칙성이 눈이 보이는 것 같은데 DP로 구현하는게 어렵습니다..ㅜㅜ

많이 풀어보는게 정답인듯!!!