반응형

문제 링크

 

2011번: 암호코드

나올 수 있는 해석의 가짓수를 구하시오. 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지를 출력한다. 암호가 잘못되어 암호를 해석할 수 없는 경우에는 0을 출력한다.

www.acmicpc.net

 

풀이 ) DP

  문자열로 입력을 받은 후 다음 case로 나눈다.

  • 0인 경우(00) : 불가능
  • 한자리 수인 경우(01~09) : 뒤의 한자리를 제외한 n-1자리로 만든 경우의 수
  • 26이하인 경우 중 10의 배수인 경우 : 뒤의 두 자리를 제외한 n-2자리로 만든 경우의 수
  • 26이하인 경우 중 10의 배수가 아닌 경우 : 뒤의 한자리와 두 자리를 제외한 n-1, n-2자리로 만든 경우의 수의 합
  • 27이상인 경우 중 10의 배수인 경우 : 27이상의 숫자로도 만들 수 없고 끝이 0이므로 불가능
  • 27이상인 경우 중 10의 배수가 아닌 경우 : 뒤의 한자리를 제외한 n-1자리로 만든 경우의 수

 

#include <cstdio>
#include <string.h>

int memo[5001] = {1, 1};

int main(void)
{
    char p[5001] = "";
    scanf("%s", p);

    if(p[0] == '0'){
      printf("0\n");
      return 0;
    }
    for(int i = 2; i <= strlen(p); i++){
        int num = (p[i-2]-'0')*10 + p[i-1]-'0';
        if(num == 0){
            printf("0\n");
            return 0;
        }
        else if(num < 10){
            memo[i] = memo[i-1];
        }
        else if(num < 27){
            if(p[i-1] == '0'){
                memo[i] = memo[i-2];
                continue;
            }
            memo[i] = memo[i-1]+memo[i-2];
        }
        else{
            if(num%10 == 0){
                printf("0\n");
                return 0;
            }
            memo[i] = memo[i-1];
        }
        memo[i] %= 1000000;
    }
    printf("%d\n", memo[strlen(p)]);
    return 0;
}

주의점 )

  - memo 배열을 초기화할 때 처음 두 원소를 1, 1로 초기화해주어 두 자리 이상에 대하여 memo[i-1]과 memo[i-2]를 모두 구할 수 있도록 해주어야 한다.

  - 0이 입력되는 경우를 위해 예외처리를 해준다.

반응형

'문제풀이 > 백준' 카테고리의 다른 글

[C++] 백준 - 14501 : 퇴사  (0) 2020.04.02
[C++] 백준 - 3190 : 뱀  (0) 2020.04.01
[C++] 백준 - 16282 : Black Chain  (0) 2020.03.27
[C++] 백준 - 1965 : 상자넣기  (0) 2020.03.26
[C++] 백준 - 2631 : 줄세우기  (0) 2020.03.26

+ Recent posts