소스코드
n = list(map(int,input()))
l = len(n)
dp = [0 for _ in range(l+1)]
if (n[0] == 0) :
print("0")
else :
n = [0] + n
dp[0]=dp[1]=1
for i in range(2, l+1):
if n[i] > 0:
dp[i] += dp[i-1]
temp = n[i-1] * 10 + n[i]
if temp >= 10 and temp <= 26 :
dp[i] += dp[i-2]
print(dp[l] % 1000000)
요새 풀었던 문제 중 가장 어려웠던 문제... ㅜㅜ 나는 왤케 이해력이 느릴까... 이런 문제를 풀 때마다 자책감이 든다...큐ㅠㅠㅠ
아무튼 풀이를 시작해보자.
25114 같은 숫자에서 각 자리수 또는 두 자리수를 알파벳으로 치환시켜 암호를 해독하는 문제이다.
알파벳은 26자리 이므로 A:1 부터 Z:26까지 의 숫자를 가질 수 있다.
즉 1~26 범위의 숫자만 알파벳으로 치환이 가능한 것이다.
* 그리고 한자리수 0은 해독할 수 없으므로 10이나 20만 알파벳으로 처리할 수 있다.
이 문제 또한 작은 문제에서부터 큰 문제로 접근해가는 상향식 접근법으로 풀 것이다.
n = 25114 같은 숫자가 주어진다면 1번 인덱스 '2' 부터 차례로 몇 개의 암호 가짓수를 가지는지 계산하면 된다.
방법은 이러하다.
1) 현재 자리숫자가 0 보다 클 때 -> 이전 dp 값을 더한다. ( 이전 dp 가 가지는 방법들 뒤에 한 자리수로 추가하기만 하면 되므로 이전 dp값을 default로 가질 수 있다. )
예) 2 5 1 1 4 에서 빨강색까지는 이미 구했다고 하자. 2 5 1 1 / 25 1 1 / 2 5 11 / 25 11 이렇게 4가지의 방법 뒤에 4를 독립적으로(한자리수로 생각) 붙힐 수 있으므로 4가지를 더할 수 있다.
2) 이전 자리수와 현재 자리수를 두 자리숫자로 볼 때 10~26사이의 숫자에 해당할 때 -> 전 전 dp 값을 더한다.
예) 2 5 1 1 4 에서 빨강색까지의 방법 -> 2 5 1 / 25 1 에다가 독립적으로 14를 붙힐 수 있으므로 2 가지를 더할 수 있다.
이렇게 두 가지 조건문을 달면 된다.
그리고 처음 숫자가 0으로 시작하는 것은 10, 20으로도 만들 수 없으므로 아예 0으로 출력해주는 예외를 추가해주면 된다.
'알고리즘 > 동적프로그래밍(DP)' 카테고리의 다른 글
[프로그래머스] N으로 표현 - 파이썬(python) (0) | 2022.09.17 |
---|---|
[Python] 백준 11052번: 카드 구매하기 풀이 (0) | 2021.02.04 |
[Python] 백준 2225번: 합분해 풀이 (0) | 2021.02.03 |
[Python] 백준 9461번: 파도반 수열 풀이 (0) | 2021.02.03 |
[Python] 백준 2133번: 타일 채우기 풀이 (1) | 2021.01.26 |
댓글