상세 컨텐츠

λ³Έλ¬Έ 제λͺ©

[λ°±μ€€(BOJ)] 1699번: 제곱수의 ν•© (Dynamic Programming, C++)

PROGRAMMING/Algorithm

by koharin 2021. 2. 22. 22:20

λ³Έλ¬Έ

728x90
λ°˜μ‘ν˜•

πŸ“ λ¬Έμ œν’€μ΄ κ³Όμ •


  • DP[i] : 숫자 iμ—μ„œ 제곱수 ν•­ μ΅œμ†Œ 개수
  • μ£Όμ˜ν•  점이, μ§€κΈˆκΉŒμ§€ 항상 인덱슀 0λΆ€ν„° μ‹œμž‘ν•΄μ„œ 0을 숫자 1둜 ν•΄μ„œ ν•˜λ €κ³  ν–ˆλŠ”λ°, 7 μ΄μƒλΆ€ν„°λŠ” μˆ˜κ°€ 잘 μ•ˆ λ§žμ•˜λ‹€. +1을 ν•˜λ©΄ 7 이전 μˆ«μžλ“€μ—μ„œ μ•ˆ 맞고, 1을 λ”ν•˜μ§€ μ•ŠμœΌλ©΄ 7λΆ€ν„°κ°€ μ•ˆ λ§žλŠ”λ‹€.
  • κ·Έλž˜μ„œ 인덱슀λ₯Ό 숫자 κ·ΈλŒ€λ‘œ ν–ˆλ”λ‹ˆ, DP[i] = min(DP[i], DP[i-j*j]+1)μ—μ„œ 4μ—μ„œλŠ” DP[4-2*2] + 1 = 0 + 1 =1, 7도 DP[7-4] + 1 = 4둜 μ œλŒ€λ‘œ λ‚˜μ˜¨λ‹€.
  • j*j <= i λ²”μœ„μ˜ λ°˜λ³΅λ¬Έμ„ 톡해 DP[i]λ₯Ό 1둜만 항을 κ΅¬μ„±ν–ˆμ„ λ•Œμ™€ DP[i-j*j] + 1μ—μ„œ μ΅œμ†Ÿκ°’μ„ DP[i]둜 κ°€μ Έκ°„λ‹€.
DP[1] = min(1, DP[0]+1) = 1
DP[2] = min(2, DP[2-1]+1) = 2
DP[3] = min(3, DP[3-1]+1) = 3
DP[4] = min(4, DP[4-2*2]+1) = 1
DP[5]: 2
DP[6]: 3
DP[7]: 4
DP[8]: 2
DP[9]: 1
DP[10]: 2
DP[11]: 3

 

 

πŸ’» C++ μ œμΆœμ½”λ“œ


#include <stdio.h>
#include <algorithm>
#include <deque>
using namespace std;

int main(){
    int N;
    scanf("%d", &N);

    deque<int> DP(N+1, 0);

    for(int i=1; i<=N; i++){
        DP[i] = i; // 1둜만 κ΅¬μ„±ν–ˆμ„ λ•Œ 개수둜 μ΄ˆκΈ°ν™”
        for(int j=1; j*j <= i; j++){
            DP[i] = min(DP[i], DP[i-j*j]+1);
        }
    }
    printf("%d", DP[N]);
    
}

 

 

πŸ‘ κ²°κ³Ό


728x90
λ°˜μ‘ν˜•

κ΄€λ ¨κΈ€ 더보기