코딩 테스트 스터디/백준

[골드 V] 2011번. 암호코드

남쪽마을밤송이 2022. 5. 8. 21:31

 문제 

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

 

2011번: 암호코드

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

www.acmicpc.net

 사용 언어 

Python3

 풀이 과정 

또다른 동적 프로그램 문제였다. 처음 아이디어는 금방 생각 했는데 코드로 구현하는데는 좀 오래걸렸던 것 같다.

특히 경우의 수를 제대로 나누는 것이 어려웠는데, 일단 0으로 시작하는 경우만 걸러주고 이후에 해독이 안되는 코드는 자동으로 걸러지도록 경우를 나누었다.

 

if code[0] == 0: # 0으로 시작하면 잘못된 코드

else:
    # 이후 한 자리, 아니면 두 자리로 해독가능한 코드인지 확인

6번만에 본 맞았습니다!!

 제출 답안 

from sys import stdin

# A = 1, B = 2, C = 3... Z = 26
# 한 자리수 아니면 두 자리수
# 두 자리수의 경우 27부터는 불가능

# 한 자리 수 : convert[x] = convert[x-1] + convert[x]
# 두 자리 수 : convert[x] = convert[x-2] + convert[x]

code = list(map(int, stdin.readline().strip()))
l = len(code)
dp = [0 for _ in range(l+1)]

if code[0] == 0: # 0으로 시작하면 잘못된 코드
    print("0")
else:
    code = [0] + code # 인덱스 맞춰주기 위해
    dp[0] = dp[1] = 1
    for i in range(2, l+1):
        if code[i] > 0:
            dp[i] += dp[i-1]
        temp = code[i-1] * 10 + code[i] # 앞자리와 합쳐줌
        if temp >= 10 and temp <= 26:
            dp[i] += dp[i-2]
    print(dp[l] % 1000000)

'코딩 테스트 스터디 > 백준' 카테고리의 다른 글

[골드 IV] 16120번. PPAP  (0) 2022.05.13
[실버 II] 1260번. DFS와 BFS  (0) 2022.05.09
[실버 II] 1912번. 연속합  (0) 2022.04.30
[실버 I] 12852번. 1로 만들기2  (0) 2022.04.28
[실버 III] 1463. 1로 만들기  (0) 2022.04.27