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 |