상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다.
어떤 암호가 주어졌을 때, 그 암호의 해석이 몇 가지가 나올 수 있는지 구하는 프로그램을 작성하시오.
첫째 줄에 5000자리 이하의 암호가 주어진다. 암호는 숫자로 이루어져 있다.
나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다.
암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.
일단 암호가 잘못된 경우는 딱 한가지 있다. 맨 앞자리가 0일 경우.
그래서 바로 str[0] == 0 이면 0을 출력하고 끝낸다.
맨 처음 이문제를 접했을 때 너무 복잡하게 생각해서 해맸었다. 그러다가 구글링하면서 메커니즘을 보니까 바로 풀 수 있었다.
기본적으로 DP[0] = 1로 초기화.
#include <iostream>
#include <string>
#define MOD 1000000
using namespace std;
int main() {
string str;
long long DP[5001] = { 0, };
int tmp;
int j;
cin >> str;
DP[0] = 1;
for (int i = 0; i < str.length(); i++)
{
j = i + 1;
if (str[0] == '0')
{
cout << 0;
return (0);
}
if (str[i] >= '1' && str[i] <= '9')
DP[j] += DP[j - 1];
if (i != 0)
{
tmp = (str[i - 1] - '0') * 10 + (str[i] - '0');
if (tmp >= 10 && tmp <= 26)
DP[j] += DP[j - 2];
}
DP[j] %= MOD;
}
cout << DP[str.length()] % MOD;
}