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

백준 C# - 15990 +) 풀이

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

문제 설명

정수 N을 1,2,3 합으로 표현하는 방법의 수 

조건 : 같은 수를 연속으로 두 번 이상 사용하면 안된다.

"1 + 1 + 2" ❌
"1 + 2 + 1" ✅

조건이 없는 경우 (연속된 숫자가 올 수 있는 경우)

 

백준 C# - 9095 +)풀이

DP를 이용해서 풀어야한다. DP알아보러 가기 C# - 다이나믹 프로그래밍(DP) 다이나믹 프로그래밍 메모리를 적절히 사용하여 수행 시간 효율성을 향상 시키는 최적화 기법중 하나이다. 큰 문제를 작

code-piggy.tistory.com

점화식

dp[n] = dp[n-1] + dp[n-2] + dp[n-3]

조건이 있는 경우(연속된 숫자가 올 수 없는 경우)

마지막 숫자만 확인하여 겹치게만 안하면 된다는 것이다. 다른말로  마지막 숫자만 체크하면 된다.

dp[n][1] = dp[n-1][2] + dp[n-1][3]   // 마지막이 1 → 그 전에는 2나 3
dp[n][2] = dp[n-2][1] + dp[n-2][3]   // 마지막이 2 → 그 전에는 1이나 3
dp[n][3] = dp[n-3][1] + dp[n-3][2]   // 마지막이 3 → 그 전에는 1이나 2

 

초기값

dp[1][1] = 1        // 1
dp[2][2] = 1        // 2
dp[3][1] = 1        // 2 + 1
dp[3][2] = 1        // 1 + 2
dp[3][3] = 1        // 3

코드 전문

using System;
using System.Text;

class Solution
{
    static void Main()
    {
        long[,] dp = new long[1000002, 4];
        int mod = 1000000009;
        dp[1, 1] = 1;
        dp[2, 2] = 1;
        dp[3, 1] = 1;
        dp[3, 2] = 1;
        dp[3, 3] = 1;

        for (int i = 4; i <= 1000001; i++)
        {
            dp[i, 1] = (dp[i - 1, 2] + dp[i - 1, 3]) % mod;
            dp[i, 2] = (dp[i - 2, 1] + dp[i - 2, 3]) % mod;
            dp[i, 3] = (dp[i - 3, 2] + dp[i - 3, 1]) % mod;
        }

        int n = int.Parse(Console.ReadLine());
        StringBuilder sb = new StringBuilder();

        while (n > 0)
        {
            int t = int.Parse(Console.ReadLine());
            sb.AppendLine(((dp[t, 1] + dp[t, 2] + dp[t, 3]) % mod).ToString());
            n--;
        }
        Console.Write(sb.ToString());
    }
}
반응형

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

백준 C# - 1699 +) 풀이  (0) 2025.04.16
백준 C# - 14002 +) 풀이  (0) 2025.04.11
백준 C# - 11053+) 풀이  (0) 2025.04.09
백준 C# - 14891 +) 풀이  (0) 2024.04.15
백준 C# - 1992 +) 풀이  (0) 2024.04.06

댓글