본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 1699 +) 풀이

by 코딩하는 돼징 2025. 4. 16.
반응형

문제

정수 n이 주어졌을때 n을 제곱수들의 합으로 표현하는 방법 중에서 항의 개수가 최소인 경우의 수를 구해야한다.

예시
12 = 4 + 4 + 4
13 = 9 + 4

 

점화식 생각

01 dp[] 배열에 어떤 값을 넣을까?

i를 만들기 위한 최소 제곱수들의 합으로 표현할 때 필요한 항의 수

02 i를 만들기 위해 바로 전 단계는 뭘까?

이미 dp[i-j*j]값을 알고있음 그래서 이번 값에서 + 1

그래서 나온 점화식

dp[i] = min(dp[i-j²]+1) (단 j²<=i)

예시) n = 5

- dp[1]
가능한 j: 1 (1²)
dp[1] = min(dp[1], dp[1 - 1] + 1) = min(∞, dp[0] + 1) = 1
dp[1] = 1

- dp[2]
가능한 j: 1 (1²)
j=1: dp[2] = min(dp[2], dp[1] + 1) = 1 + 1 = 2
dp[2] = 2

- dp[3]
가능한 j: 1 (1²)
j=1: dp[3] = dp[2] + 1 = 2 + 1 = 3
dp[3] = 3

- dp[4]
가능한 j: 1 (1²)
가능한 j: 2 (2²)
j=1: dp[3] + 1 = 4
j=2: dp[0] + 1 = 0 + 1 = 1 
dp[4] = 1

- dp[5]
가능한 j: 1 (1²)
가능한 j: 2 (2²)
j=1: dp[4] + 1 = 1 + 1 = 2
j=2: dp[1] + 1 = 1 + 1 = 2
dp[5] = 2

코드 전문

int dp[] = new int[n+1];
dp[0] = 0;

for (int i = 1; i <= n; i++)
{
    dp[i] = i; // 최악의 경우 (1^2을 i번 쓰는 경우)
    for (int j = 1; j * j <= i; j++)
    {
        dp[i] = Math.Min(dp[i], dp[i - j * j] + 1);
    }
}
반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 2225 +) 풀이  (0) 2025.04.16
백준 C# - 14002 +) 풀이  (0) 2025.04.11
백준 C# - 15990 +) 풀이  (0) 2025.04.10
백준 C# - 11053+) 풀이  (0) 2025.04.09
백준 C# - 14891 +) 풀이  (0) 2024.04.15

댓글