[Baekjoon,2011] 암호코드
한 글자씩 복호화를 진행는데 현재 숫자를 가르키는 위치의 숫자가 10~26인 추가적인 경우를 고려하며 탐색해야 한다. 즉 현재 숫자에 대해 아래의 두 가지 경우로 탐색하면 되는데 이는 동적 계획법을 쉽게 적용할 수 있다.
- 한 개의 숫자를 복호화
- 숫자가 10~26인 경우 두 자리를 복호화
하지만 예외를 처리해야 한다. 0이 처음에 나오는 경우, 0이 연속으로 두 번 나오는 경우, 30,40과 같은 숫자 배열이 나오는 경우이다. 이러한 경우는 a를 1부터 암호화 하였기 때문에 복호화를 진행할 수 없다. 이는 기저 사례를 현재 가리키는 숫자가 0인 경우 0을 반환하는 것으로 설정하여 간단히 해결 가능하다.
구현
구현된 코드를 아래에서 볼 수 있다.
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
const int MOD = 1000000;
string digits;
long cache[5001];
long solve(int here)
{
if (here == digits.size())
return 1;
// 현재 자리의 숫자가 0이면 만들 수 없다.
if (digits[here] == '0')
return 0;
long& ret = cache[here];
if (ret != -1)
return ret;
ret = 0;
// 10~26 의 경우
if (here + 1 < digits.size() && (digits[here] == '1' ||
(digits[here] == '2' && digits[here + 1] <= '6')))
ret += solve(here + 2) % MOD;
return ret = (ret + solve(here + 1)) % MOD;
}
int main()
{
cin >> digits;
memset(cache, -1, sizeof(cache));
cout << solve(0) << endl;
return 0;
}
댓글남기기