백준/실버

[백준 15993번] 1, 2, 3 더하기 8 (C++)

게임개발기원 2024. 2. 19. 19:24

문제링크 : https://www.acmicpc.net/problem/15993

 

15993번: 1, 2, 3 더하기 8

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 100,000보다 작거나 같다.

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int T, n;
ll dp[100001][2]; //짝 0, 홀 1
const int MOD = 1000000009;

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    cin >> T;
    dp[1][1] = 1; //1
    dp[2][0] = dp[2][1] = 1; //1,1 / 2
    dp[3][0] = dp[3][1] = 2; //1,2 2,1 / 1,1,1 3

    for(int i=4; i<100001; i++) //숫자
    {
        dp[i][0] = (dp[i-1][1] + dp[i-2][1] + dp[i-3][1]) % MOD; //짝수
        dp[i][1] = (dp[i-1][0] + dp[i-2][0] + dp[i-3][0]) % MOD; //홀수
    }

    while(T--)
    {
        cin >> n;
        cout << dp[n][1] << " " << dp[n][0] << "\n";
    }

    return 0;
}

 

dp식을 짝수인 경우와 홀수인 경우를 고려하여 2차원 배열로 선언해준다.

순서는 숫자 n, 짝 홀 여부이다.

 

우리가 활용하는 숫자는 1~3까지이므로 이에 맞게 1~3까지 초기값을 부여해준다.

숫자가 작기에 직접 계산하여 쉽게 구할 수 있다.

 

이후 i=4부터 10만까지 미리 계산을 해준다.

해당 i기준 짝수인 경우는 i-1, i-2, i-3을 각각 홀수개로 표현한 수 + 각 1, 2, 3으로 표현한 가짓수이다.

홀수 인경우는 반대로 i-1, i-2, i-3을 각각 짝수개로 표현한 수 + 각 1, 2, 3으로 표현한 가짓수이다.

예제를 통해 살펴보면 다음과 같다.

n=4

<짝수>
1+1+1+1
2+2
1+3
3+1

dp[4-1][1] = 3 홀수개로 표현 + 1로 표현 -> 1 (3, 1)
dp[4-2][1] = 2 홀수개로 표현 + 2로 표현 -> 1 (2, 2)
dp[4-3][1] = 1 홀수개로 표현 + 3으로 표현 -> 2 (1, 1 + 1 + 1 / 1, 3)

<홀수>
1+1+2
1+2+1
2+1+1

dp[4-1][0] = 3 짝수개로 표현 + 1로 표현 -> 2 (1 + 2, 1 / 2 + 1, 1)
dp[4-2][0] = 2 짝수개로 표현 + 2로 표현 -> 1 (1 + 1, 2)
dp[4-3][0] = 1 짝수개로 표현 + 3으로 표현 -> 0

 

이후 입력받은 n에 대해 홀수의 경우와 짝수의 경우를 순서대로 출력해주면 된다.