본문 바로가기

백준

백준2780 - 비밀번호

https://www.acmicpc.net/problem/2780

 

2780번: 비밀번호

각각의 Test case에 대해서 조건을 만족하는 비밀번호의 개수를 출력하라. 단, 수가 매우 커질 수 있으므로 비밀번호의 개수를 1,234,567으로 나눈 나머지를 출력하라.

www.acmicpc.net

간단한 DP문제였다. 숫자의 위치를 보고 직전에 있던 숫자가 바로 뒤에 나오는 경우를 더해서 1,234,567로 나눠준 뒤 출력할 때 모두 더하여 다시 한번 1,234,567로 나눠주면 된다. 

#include <iostream>
using namespace std;

int T, N;
int mat[1001][10];

void setting() {
    for(int i = 0; i <= 9; i++) {
        mat[1][i] = 1;
    }
}

void func() {
    for(int i = 2; i <= 1000; i++) {
        for(int j = 0; j <= 9; j++) {
            switch(j) {
                case 0:
                    mat[i][j] = mat[i - 1][7];
                    break;
                case 1:
                    mat[i][j] = mat[i - 1][2] + mat[i - 1][4];
                    break;
                case 2:
                    mat[i][j] = mat[i - 1][1] + mat[i - 1][3] + mat[i - 1][5];
                    break;
                case 3:
                    mat[i][j] = mat[i - 1][2] + mat[i - 1][6];
                    break;
                case 4:
                    mat[i][j] = mat[i - 1][1] + mat[i - 1][5] + mat[i - 1][7];
                    break;
                case 5:
                    mat[i][j] = mat[i - 1][2] + mat[i - 1][4] + mat[i - 1][6] + mat[i - 1][8];
                    break;
                case 6:
                    mat[i][j] = mat[i - 1][3] + mat[i - 1][5] + mat[i - 1][9];
                    break;
                case 7:
                    mat[i][j] = mat[i - 1][4] + mat[i - 1][8] + mat[i - 1][0];
                    break;
                case 8:
                    mat[i][j] = mat[i - 1][5] + mat[i - 1][7] + mat[i - 1][9];
                    break;
                case 9:
                    mat[i][j] = mat[i - 1][6] + mat[i - 1][8];
                    break;
            }
            mat[i][j] = mat[i][j] % 1234567;
        }
    }
}

int main() {
    cin >> T;
    setting();
    func();
    while(T--) {
        int ans = 0;
        cin >> N;
        for(int i = 0; i < 10; i++) {
            ans += mat[N][i];   
        }
        cout << ans % 1234567 << '\n';
    }
}

'백준' 카테고리의 다른 글

백준18115 - 카드 놓기  (0) 2020.06.12
백준1174 - 줄어드는 숫자  (0) 2020.06.12
백준17178 - 줄서기  (0) 2020.06.04
백준11779 - 최소비용 구하기 2  (0) 2020.06.01
백준2023 - 신기한 소수  (0) 2020.05.29