n๊ธธ์ด์ ์ํธ์ฝ๋๊ฐ ์๋ค๋ฉด ํด๋น ์ํธ์ฝ๋๊ฐ ๊ฐ์ง ์ ์๋ ํด์์ ์๋ ์ด์ ์ ์ํธ์ฝ๋๋ค์ด ๊ฐ์ง๋ ํด์์ ์๋ฅผ ํฌํจํ๊ฒ ๋๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ธธ์ด3์ ์ํธ์ฝ๋ 123์ (12, 3)๊ณผ (1, 23)์ผ๋ก ๋๋ ์ ์๋ค. ํด์ ๊ฐ๋ฅํ ์ํธ๋ 1~26์ฌ์ด์ ์ซ์๋ค์ด๊ธฐ ๋๋ฌธ์ 27์ ๋์ด๊ฐ๋ ์๋ ํด์ํ ์ ์๋ค. ์ฆ ์ธ ์๋ฆฌ ์ด์์ ์๋ค ์ญ์ ํด์์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ๊ธธ์ด4์ ์ํธ์ฝ๋ 1234๊ฐ ์๋ค๋ฉด (1, 234)์ ๊ฐ์ด ๋๋ ์ ํด์ํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ๋๋ฌธ์ ์์ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ง ๊ฐ์ง ์ ์๋ค.
ํด๋น ์๊ฐ ํด์ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ 1 ~ 26 ์ฌ์ด์ ์ซ์์ฌ์ผ ํ๋ค๋ ๋ป์ด ๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ n-1๋ฒ์งธ ์๊ฐ 0์ด๋ฉด 10*(n-1๋ฒ์งธ ์) + n๋ฒ์งธ ์์ ๊ณ์ฐํด์ 1 ~ 26 ์ฌ์ด์ ์ซ์๊ฐ ๋ ์ซ ์๋ค. ํ์ง๋ง ์ค์ ๋ก๋ '02' ๋ '2'๋ก ํด์๋ ์ ์์ผ๋ฏ๋ก ์์๋ฆฌ๊ฐ 0์ธ ๊ฒฝ์ฐ๋ ๋ฌด์กฐ๊ฑด ํด์์ด ๋ถ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
ํด์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ํจ์๋ check1
๊ณผ check2
๋ก ๊ฐ๊ฐ 1์๋ฆฌ ์, 2์๋ฆฌ ์์ ์๊ฐ ํด์ ๊ฐ๋ฅํ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๊ฒ ๋๋ค. ๊ฒฐ๊ตญ n๋ฒ์งธ์ 1์๋ฆฌ์๊ฐ ํด์์ด ๊ฐ๋ฅํ๋ฉด dp[n-1]๋ฒ์งธ ์์ ํด์ ๊ฐ๋ฅํ ๊ฐ์ง์๋ฅผ ๊ฐ์ ธ์์ ๋ํ ์ ์๋ค. n-1๋ฒ์งธ์ ์์ n๋ฒ์งธ ์ 2์๋ฆฌ์๊ฐ ํด์์ด ๊ฐ๋ฅํ๋ค๋ฉด 2์๋ฆฌ์ ์๋ฅผ ์ ์ธํ ๋๋จธ์ง dp[n-2]๋ฒ์งธ ์์ ํด์ ๊ฐ๋ฅํ ๊ฐ์ง์๋ฅผ ๊ฐ์ ธ์์ ๋ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ ํ์์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
dp[n] = dp[n-1] check1() + dp[n-2] check2()
import java.util.*;
import java.io.*;
public class Main {
static final int DIVIDE = 1000000;
static int check1(int a) {
return 0 < a && a < 10 ? 1 : 0;
}
static int check2(int a, int b) {
int tmp = 10 * a + b;
return a != 0 && 1 <= tmp && tmp <= 26 ? 1 : 0;
}
static int solution(int n, int[] dp, int[] arr) {
if (arr[0] == 0) return 0;
if (n > 1) {
dp[1] = check1(arr[1]) + check2(arr[0], arr[1]);
for (int i = 2; i < n; i++) {
dp[i] = dp[i-2] * check2(arr[i-1], arr[i]) + dp[i-1] * check1(arr[i]);
dp[i] %= DIVIDE;
}
}
return dp[n-1];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split("");
int[] arr = new int[input.length];
for (int i = 0; i < input.length; i++) {
arr[i] = Integer.parseInt(input[i]);
}
int[] dp = new int[input.length];
dp[0] = 1;
System.out.println(solution(arr.length, dp, arr));
}
}
``