πŸ’  Cpp/[Solved.ac] Class2~4

[BOJ][C++] λ°±μ€€ 17626번: Four Squares (Silver III)

선달 2024. 11. 20. 03:03
λ°˜μ‘ν˜•

문제

λΌκ·Έλž‘μ£ΌλŠ” 1770년에 λͺ¨λ“  μžμ—°μˆ˜λŠ” λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수의 ν•©μœΌλ‘œ ν‘œν˜„ν•  수 μžˆλ‹€κ³  증λͺ…ν•˜μ˜€λ‹€. μ–΄λ–€ μžμ—°μˆ˜λŠ” 볡수의 λ°©λ²•μœΌλ‘œ ν‘œν˜„λœλ‹€. 예λ₯Ό λ“€λ©΄, 26은 52κ³Ό 12의 합이닀; λ˜ν•œ 42+ 32+ 12으둜 ν‘œν˜„ν•  μˆ˜λ„ μžˆλ‹€. μ—­μ‚¬μ μœΌλ‘œ μ•”μ‚°μ˜ λͺ…μˆ˜λ“€μ—κ²Œ κ³΅ν†΅μ μœΌλ‘œ μ£Όμ–΄μ§€λŠ” λ¬Έμ œκ°€ λ°”λ‘œ μžμ—°μˆ˜λ₯Ό λ„· ν˜Ήμ€ κ·Έ μ΄ν•˜μ˜ 제곱수 ν•©μœΌλ‘œ λ‚˜νƒ€λ‚΄λΌλŠ” κ²ƒμ΄μ—ˆλ‹€. 1900λ…„λŒ€ μ΄ˆλ°˜μ— ν•œ μ•”μ‚°κ°€κ°€ 15663 = 1252+ 62+ 12+ 12λΌλŠ” ν•΄λ₯Ό κ΅¬ν•˜λŠ”λ° 8μ΄ˆκ°€ κ±Έλ Έλ‹€λŠ” 보고가 μžˆλ‹€. μ’€ 더 μ–΄λ €μš΄ λ¬Έμ œμ— λŒ€ν•΄μ„œλŠ” 56μ΄ˆκ°€ κ±Έλ Έλ‹€: 11339 = 1052+ 152+ 82+ 52.
μžμ—°μˆ˜n이 μ£Όμ–΄μ§ˆ λ•Œ,n을 μ΅œμ†Œ 개수의 제곱수 ν•©μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

μž…λ ₯은 ν‘œμ€€μž…λ ₯을 μ‚¬μš©ν•œλ‹€. μž…λ ₯은 μžμ—°μˆ˜n을 ν¬ν•¨ν•˜λŠ” ν•œ μ€„λ‘œ κ΅¬μ„±λœλ‹€. μ—¬κΈ°μ„œ, 1 ≤n≤ 50,000이닀.

좜λ ₯

좜λ ₯은 ν‘œμ€€μΆœλ ₯을 μ‚¬μš©ν•œλ‹€. 합이nκ³Ό κ°™κ²Œ λ˜λŠ” μ œκ³±μˆ˜λ“€μ˜ μ΅œμ†Œ 개수λ₯Ό ν•œ 쀄에 좜λ ₯ν•œλ‹€.

 

풀이

// 풀이 : https://whkakrkr.tistory.com

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n;
    cin >> n;
    
    vector<int>dp(n+1, n);
    dp[1] = 1;
    
    for(int i=2; i<=n; i++) {
        for(int j=1; j*j<=i; j++) {
            if(j*j == i) {
                dp[i] = 1;
            }
            dp[i] = min(dp[i-j*j]+dp[j*j], dp[i]);
        }
    }
    
    cout << dp[n];
	
    
    return 0;
}
λ°˜μ‘ν˜•