https://www.acmicpc.net/problem/2011
- 다이나믹 프로그래밍
import sys
input = sys.stdin.readline
nums = [' '] + list(input().strip())
dp = [0]*len(nums)
dp[0] = 1
valid = True
for i in range(1, len(nums)):
if i == 1:
if nums[1] == '0':
valid = False
break
else:
dp[1] = 1
continue
if 10 <= int(nums[i-1] + nums[i]) <= 26:
if nums[i] == '0':
dp[i] = dp[i-2]
else:
dp[i] = (dp[i-1] + dp[i-2]) % 1000000
else:
if nums[i] == '0':
valid = False
break
else:
dp[i] = dp[i-1]
if valid:
print(dp[-1])
else:
print(0)
dp[i]의 값은 다음과 같이 정해진다.
int(nums[i-1] + nums[i])의 값이 10이상 26이하인 경우
dp[i] = dp[i-2]
dp[i] = dp[i-1] + dp[i-2]
int(nums[i-1] + nums[i])의 값이 10이상 26이하가 아닌 경우 (두자리로는 유효한 암호가 되지 않는 경우)
invalid, 0 출력!
dp[n] = dp[n-1]
예시 1: 25114를 해석하는 방법의 수 (6가지)
예시 2: 121074110을 해석하는 방법의 수 (2가지)