[BOJ] 1699 / 제곱수의 합 / Python 파이썬
[BOJ] 1699 / 제곱수의 합 / Python 파이썬
https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
풀이
주어진 숫자와 제곱수와의 차이를 생각하는것이 문제의 해결 방법이었다.
N = 1 -> 1 -> 1
N = 2 -> 1 + 1 -> 2
N = 3 -> 1 + 1 + 1 -> 3
N = 4 -> 2 -> 1
N = 5 -> 2 + 1 -> 2
N = 6 -> 2 + 1 + 1 -> 3
N = 7 -> 2 + 1 + 1 + 1 -> 4
N = 8 -> 2 + 2 -> 2
N = 9 -> 3 -> 1
N = 10 -> 3 + 1 -> 2
N = 11 -> 3 + 1 + 1 -> 3
N = 12 -> 2 + 2 + 2 -> 3
N = 13 -> 3 + 2 -> 2
N = 14 -> 3 + 2 + 1 -> 3
N = 15 -> 3 + 2 + 1 + 1 -> 4
N = 16 -> 4 -> 1
주어진 숫자가 제곱수라면 제곱수의 합은 항상 1 이 된다.
그러므로, 주어진 숫자와 제 수와의 차이가 제곱수의 합의 결과가 된다.
물론 8 과 12 등의 반례도 존재한다.
이러한 반례들을 고려 하였을때, dp 를 이용하여 최소 값을 구해 나가야한다.
N = int(input())
dp = [ i for i in range(N+1)]
for i in range(1, N+1):
tmp = []
for j in range(1, i):
if j*j > i:
break
tmp.append(dp[i - j*j])
if tmp:
dp[i] = min(tmp) + 1
print(dp[N])
경우의 수를 나열 하였을 때, 제곱으로 만들어지는 수와 제곱수와의 관계는 생각하였지만,
답을 계산하는 것 까지 도달하지 못하였다.
다른 분들의 풀이를 참고 하였지만, 와 닿지 않는 상태이기도 하다.
참고 블로그
https://jyeonnyang2.tistory.com/50
[Python] 백준 1699번: 제곱수의 합 풀이
소스코드 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값을 1부터 n까..
jyeonnyang2.tistory.com
https://pacific-ocean.tistory.com/205
[백준] 1699번(python 파이썬)
문제 링크: https://www.acmicpc.net/problem/1699 1699번: 제곱수의 합 어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지.
pacific-ocean.tistory.com