ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2011] 암호코드
    BOJ 2021. 9. 11. 15:35

    https://www.acmicpc.net/problem/2011

     

    2011번: 암호코드

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

    www.acmicpc.net

    <문제>

    여러개의 경우로 나누어 점화식대로 구현해주면 된다. 아래 소스코드의 주석과 함께 보자.

    <소스코드>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    #include<stdio.h>
    #include<string.h>
    int dp[5001];
    char s[5002];
    int main(void) {
        int i;
        const int m = 1000000;
        scanf("%s", s);
        int len = strlen(s);
        dp[0= 1;
        dp[1= 1;
        if (s[0- '0' == 0) {
            printf("0");
            return 0;
        }
        for (i = 1; s[i]; i++) {
            dp[i - 1= dp[i - 1] % m;
            if (s[i - 1- '0' == 0 && s[i] - '0' == 0) {// 00
                printf("0");
                return 0;
            }
            if (s[i - 1- '0' >= 3 && s[i] - '0' == 0) {// 30
                printf("0");
                return 0;
            }
            if (s[i - 1- '0' == 0 && s[i] - '0' != 0) { // 20 9 : 이미 합쳐서 합칠 수 없는경우
                dp[i] = dp[i - 1];
                continue;
            }
            if (s[i - 1- '0' <= 2 && s[i] - '0' == 0 && s[i - 1- '0' != 0) {//10,20 : 합쳐야만 하는 경우 
                if (i >= 2)dp[i] = dp[i - 2];
                else if (i == 1)dp[i] = 1;
                continue;
            }
            if (s[i - 1- '0' == 1 && s[i] - '0' != 0) {// 19 : 앞자리가 1이라 합쳐지는 경우
                if (i >= 2)dp[i] = dp[i - 1+ dp[i - 2];
                else if (i == 1)dp[i] = 2;
                continue;
            }
            if (s[i - 1- '0' <= 2 && s[i] - '0' <= 6) { //23 : 앞글자와 합쳐지는 경우(21~26)
                if (i >= 2)dp[i] = dp[i - 1+ dp[i - 2];
                else if (i == 1)dp[i] = 2;
                continue;
            }
            dp[i] = dp[i - 1];//28 : 합쳐지지 않음
        }
        printf("%d", dp[i - 1]%m);
        return 0;
    }
    cs

     

    'BOJ' 카테고리의 다른 글

    [1753] 최단경로  (0) 2021.09.13
    [11508] 2+1 세일  (0) 2021.09.12
    [16236] 아기 상어  (0) 2021.09.09
    [16933] 벽 부수고 이동하기 3  (0) 2021.09.09
    [14442] 벽 부수고 이동하기 2  (0) 2021.09.09

    댓글