프로그래밍/Python

[Python] 백준 2011 암호코드

모영이 2021. 3. 8. 18:57

 

2011번: 암호코드

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

www.acmicpc.net

다이나믹 프로그래밍 : 한번에 이해하기 어려웠다. 왜 i - 2인덱스에 접근해야 할까. 특정한 상황이 아니면 DP[i] = DP[i - 1] 이다. 하지만 뒤에 수를 가져다 붙여서 두자리 수 and 26이하의 수를 만들 수 있다면 DP[i - 2]를 추가해주어야 한다.

i - 2에 접근하는 이유는 갖다 붙일 수 있는 상태의 수이기 때문이다. 

DP[3] (2, 5, 1), (25, 1)

DP[4] (2, 5, 1, 1), (25, 1, 1), (2, 5, 11), (25, 11) 

DP[5]는 (2, 5, 1, 1, 4), (25, 1, 1, 4), (2, 5, 11, 4), (25, 11, 4) 이렇게 DP[4]의 값에 그대로 추가하는 방법 1가지와

           (2, 5, 1, 14), (25, 1, 14) 이렇게 (DP[3]값에 그대로 추가한 방법)에 숫자를 붙이는 방법 1가지를 더해주어야 한다.

 

인덱스 2개 이전의 값을 더해주는게 핵심같다.

 

전체코드

import sys

input = sys.stdin.readline

nums = list(str(input().strip()))
dp = [0 for _ in range(len(nums) + 1)]
dp[0], dp[1] = 1, 1
if nums[0] == '0':
    print(0)
else:
    for i in range(2, len(nums) + 1):
        if int(nums[i - 1]) > 0:
            dp[i] += dp[i - 1]
        to_int = int(nums[i - 2] + nums[i - 1])
        if 10 <= to_int <= 26:
            dp[i] += dp[i - 2]
    print(dp[len(nums)] % 1000000)

 

'프로그래밍 > Python' 카테고리의 다른 글

[Python] 백준 1766 문제집  (0) 2021.03.10
[Python] 백준 1516 게임 개발  (0) 2021.03.10
[Python] 백준 15663 N과 M (9)  (0) 2021.03.08
[Python] 백준 1167 트리의 지름  (0) 2021.03.08
[Python] 백준 15654 N과 M (5)  (0) 2021.03.05