자료구조 및 알고리즘/백준

[python] 17636. Four Squares

viamemine 2024. 6. 3. 19:22
728x90
반응형

문제: https://www.acmicpc.net/problem/17626

 

 

풀이

 

이번 문제는 제곱수의 합을 구하는 문제입니다.

dp로 해결했는데, 점화식을 찾는 것이 쉽지 않았습니다. 

 

 

이해를 위해 그림을 첨부했습니다. 

i를 가지고 j를 만든다고 할 때, 그림처럼 항의 개수를 가지게 됩니다.

 

이는 제곱수일 때 +1만큼 커지게 됩니다. (그림을 보고 이해하시면 되겠습니다 !)

 

브루트포스로도 문제를 해결할 수 있습니다.

주석과 함께 코드를 첨부해두겠습니다.

 

 

 

- DP 문제 풀이

N = int(input())
dp = [n for n in range(N+1)]

for i in range(2, int(N**0.5)+1):
    for j in range(i*i, N+1):
        dp[j] = min(dp[j], dp[j-i*i]+1)

print(dp[N])

 

 

 

- 브루트포스 문제 풀이

n = int(input())
arr = [0 if i**0.5%1 else 1 for i in range(n+1)] # 제곱수는 1로 저장

min_ = 4
for i in range(int(n**0.5), 0, -1):
    if arr[n]: # n이 제곱수인 경우
        min_ = 1
        break
    elif arr[n-i*i]: # 나머지가 제곱수인 경우
        min_ = 2
        break
    else:
        for j in range(int(n-i*i)**0.5, 0, -1):
            if arr[(n-i*i)-j**2]: # 제곱수를 한번 더 뺀 나머지가 제곱수일 경우
                min_ = 3
print(min_)

 

 

 

728x90

'자료구조 및 알고리즘 > 백준' 카테고리의 다른 글

[python] 1463. 1로 만들기  (0) 2024.06.04
[python] 1699. 제곱수의 합  (1) 2024.06.03
[python] 2839. 설탕 배달  (0) 2024.06.02
[python] 10870. 피보나치 수 5  (0) 2024.06.01
[python] 5618. 공약수  (0) 2024.05.31