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;
}
'코딩테스트 연습 > Baekjoon' 카테고리의 다른 글
[Baekjoon] 1932번: 정수 삼각형 / dynamic (0) | 2022.04.01 |
---|---|
[Baekjoon] 1912번: 연속합 (0) | 2022.04.01 |
[Baekjoon] 16194번: 카드 구매하기 2 / dynamic (0) | 2022.04.01 |
[Baekjoon] 15990번: 1, 2, 3 더하기 5 / dynamic (0) | 2022.03.31 |
[Baekjoon] 15988번: 1, 2, 3 더하기 3 / dynamic (0) | 2022.03.31 |