카테고리 없음

[백준] 암호코드 - Java

너지살 2022. 5. 9. 19:08

 

문제출저 : 

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

 

2011번: 암호코드

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

www.acmicpc.net

 

 

소스코드 : 

package studyGroup.april.april21;

/*
DP문제
https://iamheesoo.github.io/blog/algo-boj2011
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class 암호코드2011 {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();

        int num = 1000000;
        int n = s.length(); // 숫자의 길이

        // 시작이 0이면 잘못된 암호
        if(s.charAt(0) == '0')
        {
            System.out.println("0");
            return;
        }

        long[] dp = new long[n+1];
        dp[0] = 1;
        dp[1] = 1;

        for(int i = 2; i <= n; i++)
        {
            char ch = s.charAt(i-1);
            char prev = s.charAt(i-2);

            if(ch=='0')
            {
                if(prev == '1' || prev == '2')
                {
                    dp[i] = dp[i-2]%num;
                }
                else break;
            }
            else
            {
                if(prev == '0')
                {
                    dp[i] = dp[i-1]%num;
                }
                else
                {
                    int temp = (prev - '0') * 10 + (ch - '0');
                    if(1 <= temp && temp <= 26)
                    {
                        dp[i] = (dp[i-2] + dp[i-1])%num;
                    }
                    else
                    {
                        dp[i] = dp[i-1]%num;
                    }
                }
            }
        }

        System.out.println(dp[n]%num);
    }
}