백준(Python) 풀이/다이나믹 프로그래밍

백준(Python) 2011번 암호코드 풀이

개발윗미 2022. 3. 5. 09:37

Python으로 구현한 2011번 암호코드 문제 풀이입니다.

 

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

 

2011번: 암호코드

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

www.acmicpc.net


data = list(map(int, list(input())))
l = len(data)

dp = [0] * (l + 1)

if data[0] == 0 :
	print(0)
else :
	data = [0] + data
	dp[0] = 1
	dp[1] = 1 # 암호코드 1개

	for i in range(2, l + 1) :
		value = data[i] # 한자리
		value2 = data[i-1] * 10 + data[i] # 두자리
		if value >= 1 and value <= 9 :
			dp[i] += dp[i-1]
		if value2 >= 10 and value2 <= 26 :
			dp[i] += dp[i-2]

		dp[i] %= 1000000

	print(dp[l])

 

1. 입력받은 data리스트 요소 중 0번째 값이 0일 경우 암호를 만들 수 없으므로 0을 출력한다.

 

2. 그렇지 않을 경우 인덱싱을 위해 가장 첫번째 요소에 0을 추가하고, 0번째와 1번째 값을 1로 갱신한다.

   첫번째 수로 이루어진 암호코드는 1개이기 때문이다.

 

3. 반복문을 통해 2번째 값부터 암호코드 개수를 갱신해주는데, value에 a[i] 값을 가져와 한 자리 수를 가져온다.

 

4. value2에 a[i-1] 값을 가져와 10을 곱하고 a[i]를 더함으로써 두 자리 수를 가져온다.

 

5. 만약 value값이 1 이상 9 이하일 경우 이전의 dp 값을 더한다.

 

6. 만약 value2값이 10 이상 26 이하일 경우 두번째 전(dp[i-2]) dp 값을 더한다.

 

7. 문제에서 요구한 바와 같이 정답이 매우 클 수 있으므로, 1000000으로 나눈 나머지로 갱신한다.

 

8. 반복문이 종료되면 최종적으로 dp의 가장 마지막 값을 출력한다.