Home LeetCode - 279. Perfect Squares
Post
Cancel

LeetCode - 279. Perfect Squares

279. Perfect Squares - medium

문제

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.

제한사항

입출력 예

1
2
3
4
5
6
7
8
9
Example 1:
Input: n = 12
Output: 3 
Explanation: 12 = 4 + 4 + 4.

Example 2:
Input: n = 13
Output: 2
Explanation: 13 = 4 + 9.

풀이

  • DP
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
32
33
34
class Solution {
public:
    int numSquares(int n) {
        int digit = 1;
        vector<int> item(n+1, 1);
        
        item[0] = 0;
        
        // 1...n 까지 제곱수 끼리의 합을 만드는 방법은
        // item[n] = item[n - sqrt(i)] + 1 이며,
        // 가장 수가 적게 만들어야 하므로 i를 1부터 최대 제곱근까지 검사
        for(auto i = 1 ; i <= n ; ++i){
            
            // 현재 i까지의 최대 제곱근 검사
            int sr = sqrt(i);
            if((sr - floor(sr)) == 0){
                digit = sr * sr;
            }
            
            // 1부터 현재 i까지의 최대 제곱근까지,
            // 제곱끼리의 합이 i를 만족하며 갯수가 최소인 갯수를 검사
            int minVal = INT_MAX;
            for(auto j = 1 ; (j*j) <= digit ; ++j){
                int val = item[i] + item[i - (j*j)]; 
                minVal = min(minVal, val);
            }
            
            // 찾은 최소값을 현재 item[i] 에 저장
            item[i] = minVal;
        }
        
        return item[n];
    }
};
This post is licensed under CC BY 4.0 by the author.