본문 바로가기

전공지식/알고리즘

[백준][DP][2011] 암호코드

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


- 소스코드

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

public class Main {
	
	public static int mod = 1000000;
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		int length = input.length();
		int[] dp = new int[length + 1];
		
		dp[0] = 1;
		for (int i = 1; i <= length; i++) {
			int num = input.charAt(i - 1) - '0';
			if (1 <= num && num <= 9) {
				dp[i] += dp[i - 1];
				dp[i] %= mod;
			}
			
			if (i == 1) {
				continue;
			}
			
			if ((input.charAt(i - 2) - '0') == 0) {
				continue;
			}
			
			int prev = (input.charAt(i - 2) - '0') * 10;
			int curr = input.charAt(i - 1) - '0';

			if (prev + curr <= 26) {
				dp[i] += dp[i - 2];
				dp[i] %= mod;
			}
		}
		
		System.out.println(dp[length]);
	}
	
}


- My Thinking



- Logic




 여기서 가장 중요한 부분은 문자열에 " " 빈 값을 넣는 이유는 index가 2일 때 dp[i-2]를 처리하기 위해서이다.

그리고 dp[0]을 1로 두는 이유는 경우의 수의 문제인 경우 dp[0]을 1로 두고서 계산하는 경우가 많다.


0개를 사용해서 만든 " "를 사용한 방법 + 1번째 자리까지 해석했을 때 경우의 수 = dp[1]

0개를 사용해서 만든 " "를 사용한 방법 + 2번째 자리까지 해석했을 때 경우의 수 = dp[2]