※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2780번 문제인 비밀번호이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2780
2780번: 비밀번호
각각의 Test case에 대해서 조건을 만족하는 비밀번호의 개수를 출력하라. 단, 수가 매우 커질 수 있으므로 비밀번호의 개수를 1,234,567으로 나눈 나머지를 출력하라.
www.acmicpc.net
길이가 N(>2)이고 자리 i로 끝나는 비밀번호의 개수는 길이가 N-1이고 i와 인접한 칸에 적힌 비밀번호의 개수들의 합과 같음을 관찰하자.
위와 같은 점화관계를 이용해 1000까지의 문제의 답을 미리 구해두고, 각 N에 대해 답을 빠르게 출력해 문제를 해결하자.
아래는 제출한 소스코드이다.
#define MOD 1234567
#include <iostream>
using namespace std;
int T;
int dp[1001][10];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int i = 0; i < 10; i++) dp[1][i] = 1;
for (int n = 2; n < 1001; n++) {
dp[n][0] = dp[n - 1][7] % MOD;
dp[n][1] = (dp[n - 1][2] + dp[n - 1][4]) % MOD;
dp[n][2] = (dp[n - 1][1] + dp[n - 1][3] + dp[n - 1][5]) % MOD;
dp[n][3] = (dp[n - 1][2] + dp[n - 1][6]) % MOD;
dp[n][4] = (dp[n - 1][1] + dp[n - 1][5] + dp[n - 1][7]) % MOD;
dp[n][5] = (dp[n - 1][2] + dp[n - 1][4] + dp[n - 1][6] + dp[n - 1][8]) % MOD;
dp[n][6] = (dp[n - 1][3] + dp[n - 1][5] + dp[n - 1][9]) % MOD;
dp[n][7] = (dp[n - 1][4] + dp[n - 1][8] + dp[n - 1][0]) % MOD;
dp[n][8] = (dp[n - 1][5] + dp[n - 1][7] + dp[n - 1][9]) % MOD;
dp[n][9] = (dp[n - 1][6] + dp[n - 1][8]) % MOD;
}
cin >> T;
while (T--) {
int x; cin >> x;
int ans = 0;
for (int i = 0; i < 10; i++) ans += dp[x][i];
cout << ans % MOD << '\n';
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 2993 // C++] 세 부분 (0) | 2024.01.16 |
---|---|
[BOJ 2992 // C++] 크면서 작은 수 (1) | 2024.01.15 |
[BOJ 6193 // C++] Hungry Cows (1) | 2024.01.13 |
[BOJ 6192 // C++] Cow Pie Treasures (0) | 2024.01.12 |
[BOJ 6191 // C++] Cows on Skates (0) | 2024.01.11 |