1699
문제
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=3^2+1^2+1^2(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=2^2+2^2+1^2+1^2+1^2(5개 항)도 가능하다. 이 경우, 수학자 숌크라테스는 “11은 3개 항의 제곱수 합으로 표현할 수 있다.”라고 말한다. 또한 11은 그보다 적은 항의 제곱수 합으로 표현할 수 없으므로, 11을 그 합으로써 표현할 수 있는 제곱수 항의 최소 개수는 3이다.
주어진 자연수 N을 이렇게 제곱수들의 합으로 표현할 때에 그 항의 최소개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 N이 주어진다. (1 ≤ N ≤ 100,000)
출력
주어진 자연수를 제곱수의 합으로 나타낼 때에 그 제곱수 항의 최소 개수를 출력한다.
풀이
- dp배열을 i 인덱스로 초기화한다.(모든 제곱수 합을 1로 할 경우)
- j로 반복문을 한번 더 돌리면서 dp[i - j*j]는 dp[i - j*j]에서 제곱수 j*j를 더한것과 같다.
dp[9]를 예로 들어보자.
초기화는 1 + 1 + ... + 1로 9가 될 것이다. 근데 dp[9 - 3x3] = dp[0] = 0이니 최종적으로는 1이 된다.
dp[11]로 또 한번 계산해보자.
dp[11 - 3x3] = dp[2] = 2이다. dp[2] + 3x3 = dp[11]이므로 3이 된다.
코드
#include <iostream>
#include <vector>
#define MIN(a, b) (a < b) ? a : b
using namespace std;
int main()
{
int n;
scanf("%d", &n);
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; i++)
{
dp[i] = i;
for (int j = 1; j * j <= i; j++)
{
dp[i] = MIN(dp[i], dp[i - (j * j)] + 1);
}
}
cout << dp[n] << endl;
return (0);
}
Author And Source
이 문제에 관하여(1699), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@lsmmay322/백준-1699
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
dp[9]를 예로 들어보자.
초기화는 1 + 1 + ... + 1로 9가 될 것이다. 근데 dp[9 - 3x3] = dp[0] = 0이니 최종적으로는 1이 된다.
dp[11]로 또 한번 계산해보자.
dp[11 - 3x3] = dp[2] = 2이다. dp[2] + 3x3 = dp[11]이므로 3이 된다.
#include <iostream>
#include <vector>
#define MIN(a, b) (a < b) ? a : b
using namespace std;
int main()
{
int n;
scanf("%d", &n);
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; i++)
{
dp[i] = i;
for (int j = 1; j * j <= i; j++)
{
dp[i] = MIN(dp[i], dp[i - (j * j)] + 1);
}
}
cout << dp[n] << endl;
return (0);
}
Author And Source
이 문제에 관하여(1699), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lsmmay322/백준-1699저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)