Python으로 구현한 2011번 암호코드 문제 풀이입니다.
https://www.acmicpc.net/problem/2011
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의 가장 마지막 값을 출력한다.
'백준(Python) 풀이 > 다이나믹 프로그래밍' 카테고리의 다른 글
백준(Python) 10844번 쉬운 계단 수 풀이 (0) | 2022.03.07 |
---|---|
백준(Python) 11052번 카드 구매하기 풀이 (0) | 2022.03.05 |
백준(Python) 2225번 합분해 풀이 (0) | 2022.03.03 |
백준(Python) 9461번 파도반 수열 풀이 (0) | 2022.03.03 |
백준(Python) 2133번 타일 채우기 풀이 (0) | 2022.03.03 |