-
[2011] 암호코드BOJ 2021. 9. 11. 15:35
https://www.acmicpc.net/problem/2011
2011번: 암호코드
나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.
www.acmicpc.net
<문제>
여러개의 경우로 나누어 점화식대로 구현해주면 된다. 아래 소스코드의 주석과 함께 보자.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#include<stdio.h>#include<string.h>int dp[5001];char s[5002];int main(void) {int i;const int m = 1000000;scanf("%s", s);int len = strlen(s);dp[0] = 1;dp[1] = 1;if (s[0] - '0' == 0) {printf("0");return 0;}for (i = 1; s[i]; i++) {dp[i - 1] = dp[i - 1] % m;if (s[i - 1] - '0' == 0 && s[i] - '0' == 0) {// 00printf("0");return 0;}if (s[i - 1] - '0' >= 3 && s[i] - '0' == 0) {// 30printf("0");return 0;}if (s[i - 1] - '0' == 0 && s[i] - '0' != 0) { // 20 9 : 이미 합쳐서 합칠 수 없는경우dp[i] = dp[i - 1];continue;}if (s[i - 1] - '0' <= 2 && s[i] - '0' == 0 && s[i - 1] - '0' != 0) {//10,20 : 합쳐야만 하는 경우if (i >= 2)dp[i] = dp[i - 2];else if (i == 1)dp[i] = 1;continue;}if (s[i - 1] - '0' == 1 && s[i] - '0' != 0) {// 19 : 앞자리가 1이라 합쳐지는 경우if (i >= 2)dp[i] = dp[i - 1] + dp[i - 2];else if (i == 1)dp[i] = 2;continue;}if (s[i - 1] - '0' <= 2 && s[i] - '0' <= 6) { //23 : 앞글자와 합쳐지는 경우(21~26)if (i >= 2)dp[i] = dp[i - 1] + dp[i - 2];else if (i == 1)dp[i] = 2;continue;}dp[i] = dp[i - 1];//28 : 합쳐지지 않음}printf("%d", dp[i - 1]%m);return 0;}cs 'BOJ' 카테고리의 다른 글
[1753] 최단경로 (0) 2021.09.13 [11508] 2+1 세일 (0) 2021.09.12 [16236] 아기 상어 (0) 2021.09.09 [16933] 벽 부수고 이동하기 3 (0) 2021.09.09 [14442] 벽 부수고 이동하기 2 (0) 2021.09.09