PS

BOJ 1309 : 동물원

lickelon 2025. 2. 2. 00:09
  • 문제 링크 : boj.kr/1309
  • 난이도 : S1
  • 태그 : DP

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF
#define MOD 9901

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

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

    int n;
    cin >> n;

    vector<array<int, 3>> arr(n); //None, Left, Right
    arr[0] = {1,1,1};
    for(int i = 1; i < n; i++) {
        arr[i][0] = (arr[i-1][0]+arr[i-1][1]+arr[i-1][2]) % MOD;
        arr[i][1] = (arr[i-1][0]+arr[i-1][2]) % MOD;
        arr[i][2] = (arr[i-1][0]+arr[i-1][1]) % MOD;
    }

    cout << (arr[n-1][0]+arr[n-1][1]+arr[n-1][2]) % MOD;

    return 0;
}

풀이

한 행에 가능한 상태는 1. 사자가 없는 경우, 2. 사자가 왼쪽에 있는 경우, 3. 사자가 오른쪽에 있는 경우 총 세 가지이다.

각각의 상태에 대해서 가능한 경우의 수를 순차적으로 구해주면 답을 쉽게 구할 수 있다.

728x90