코딩테스트 연습/Baekjoon
[Baekjoon] 1699번: 제곱수의 합 / dynamic
수기
2022. 4. 1. 02:15
https://www.acmicpc.net/problem/1699
1699번: 제곱수의 합
어떤 자연수 N은 그보다 작거나 같은 제곱수들의 합으로 나타낼 수 있다. 예를 들어 11=32+12+12(3개 항)이다. 이런 표현방법은 여러 가지가 될 수 있는데, 11의 경우 11=22+22+12+12+12(5개 항)도 가능하다
www.acmicpc.net
i보다 작은 j의 제곱수를 찾으면, 제곱수는 항 최소개수가 1이므로 최솟값을 찾을 수 있다. i보다 작은 j의 제곱수를 찾고, square[i - (j*j)] + 1를 구하면 된다.
n은 최대 100000까지 들어 올 수 있고, 2초 시간제한이 있으므로
j*j<=i 를 이용하여 해결했다.
코드
//1699
#include <iostream>
#include <cmath>
using namespace std;
int MIN(int a, int b){
if(a < b) return a;
else return b;
}
int main(int argc, const char * argv[]) {
int n;
int square[100001]={0};
// square[1]= 1;
cin >> n;
for(int i=2;i<=n;i++){
square[i]=99999;
for(int j=1; j*j<=i; j++){
square[i] = min(square[i], square[i - j*j]+1);
}
}
cout << square[n];
return 0;
}