문제출저 :
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);
}
}