현재 숫자와 이전숫자가 11 ~ 26일 경우 현재 숫자와 이전 숫자를 따로 봤을 때 가능한 이전까지의 방법 수와,
하나의 봤을 때 가능한 이전이전까지의 방법 수를 더해서 답을 구했다.
그리고! 10으로 나누어 떨어질 때 가능한 경우는 1이므로 적절한 예외처리가 필요하다.
첫째 자리가 0일 경우에도 코드 조합을 만들 수 없으므로 적절한 처리를 해주자.
#include <iostream>
#include <string>
int main(void) {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::string val;
std::cin >> val;
int dp[5001] = { 0 };
dp[0] = 1;
dp[1] = dp[0];
int check = (val[0] - '0') * 10 + (val[1] - '0');
if(check >= 10 && check <= 26 && check % 10 != 0) {
dp[1]++;
}
if((val.size() == 2 && (check % 10 == 0 && check > 26)) || val[0] == '0') {
std::cout << 0 << "\n";
return 0;
}
for(int i = 2; i < val.size(); i++) {
check = (val[i - 1] - '0') * 10 + (val[i] - '0');
dp[i] = dp[i - 1];
if(check > 10 && check < 27 && check % 10 != 0) {
dp[i] = (dp[i] + dp[i - 2]) % 1000000;
}
if (check >= 10 && check % 10 == 0) {
dp[i] = dp[i - 2];
dp[i - 1] = dp[i - 2];
}
}
std::cout << dp[val.size() - 1] << "\n";
return 0;
}
|
cs |
'problem solving' 카테고리의 다른 글
2186번: 문자판 (0) | 2020.03.05 |
---|---|
2133번: 타일 채우기 (0) | 2020.03.05 |
[하노이 탑]재귀 (0) | 2020.03.05 |
10844번: 쉬운 계단 수 (0) | 2020.03.05 |
10815번: 숫자 카드 (0) | 2020.03.04 |