Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

풀이 보관함

[C++] 백준 1699번: 제곱수의 합 본문

problem solving/백준

[C++] 백준 1699번: 제곱수의 합

viin 2023. 2. 3. 17:32

 

문제

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

 

1699번: 제곱수의 합

어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다

www.acmicpc.net

 

풀이 

 

 

 

dp[i]: N을 제곱수로 나눴을 때 가장 작은 제곱 항수를 저장하는 변수

- dp[i]은 초기값으로 N을 가진다. (1 제곱 * N항 )

 

그리고 나서 재귀관계식을 찾아주었다. 

나는 N이 13일 때까지 쭉 나열하며 재귀관계식을 찾을 수 있었다. 

 

- N에서 나눠떨어지는 숫자가 있으면 나눠떨어지는 숫자는 무조건 1이다. (4, 8, 16, 25..)

N에서 나눠떨어지는 숫자를 뺀 값 (N-(j*j)을 dp에서 빼와 더하면 된다. 

dp[i] = std::min(dp[i], dp[i-(j*j)]+1)

 

소스 코드

#include <iostream>
#include <cmath> // min

int main(){

	int dp[100001];
	int n; std::cin >> n;

	for(int i=1; i<=n; ++i)
	{
		dp[i] = i;
		for(int j=2; j*j<=i; ++j)
		{
			dp[i] = std::min(dp[i], dp[i-j*j]+1);
		}
	}

 	std::cout << dp[n];

	return 0;
}