※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts