본문 바로가기

problem solving

2011번: 암호코드

현재 숫자와 이전숫자가 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