Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- BFS
- 싸피
- 정수론
- 애드 혹
- 세그먼트 트리
- 에라토스테네스의 체
- 누적 합
- 브루트포스
- 그래프
- Python
- 슬라이딩 윈도우
- 모던 JavaScript 튜토리얼
- boj
- 정렬
- 플로이드-워셜
- 13164
- 해시 테이블
- 그리디
- 문자열
- 구현
- 이분 탐색
- 수학
- DFS
- 트리
- DP
- 맵
- SSAFY
- 투 포인터
- JavaScript
- 2357
Archives
- Today
- Total
흙금이네 블로그
[BOJ] 2011 - 암호코드 (Python) 본문
아이디어
동적 계획법으로 암호를 구성하는 숫자들이 직전의 숫자와 붙을 수 있는지 여부를 확인하여 가짓수를 구한다.
풀이
10과 20을 제외하고 0으로 시작하거나 30처럼 0이 포함된 암호는 해석할 수 없으므로 0을 출력한다.
elif문에서 0이 아니면서 N의 길이가 1인 암호는 1을 출력한다.
그 외의 경우는 1로 채워진 N+1 길이의 리스트 dp를 생성하고, for문에서 암호를 구성하는 숫자들을 차례로 확인한다.
만약 현재 숫자가 0인 경우 직전 숫자와 붙여야 하므로 앞의 숫자 이전의 경우로 되돌린다.
직전 숫자가 0이 아니면서 현재 숫자를 직전 숫자와 붙일 수 있으면 직전 숫자까지의 가짓수와 그 이전 가짓수를 더한다.
그 외에 직전 숫자와 붙일 수 없는 경우는 직전 숫자까지의 가짓수로 저장한다.
code = input()
N = len(code)
if code.count('10')+code.count('20') != code.count('0'):
print(0)
elif N <= 1:
print(1)
else:
dp = [1]*(N+1)
for i in range(1, N):
dp[i+1] = dp[i]
if code[i] == '0':
dp[i+1] = dp[i-1]
elif code[i-1] != '0' and int(code[i-1:i+1]) <= 26:
dp[i+1] += dp[i-1]
print(dp[-1]%1000000)
'알고리즘' 카테고리의 다른 글
[BOJ] 2631 - 줄세우기 (Python) (0) | 2023.02.08 |
---|---|
[BOJ] 15658 - 연산자 끼워넣기 (2) (Python, JavaScript) (0) | 2023.02.07 |
[BOJ] 18429 - 근손실 (Python, JavaScript) (0) | 2023.02.06 |
[BOJ] 2096 - 내려가기 (Python) (0) | 2023.02.05 |
[BOJ] 1377 - 버블 소트 (Python) (0) | 2023.02.05 |
Comments