백준 2011번 : 암호코드 파이썬/Python - DP

2023. 1. 4. 01:19·Algorithm (PS)
728x90

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

 

2011번: 암호코드

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

www.acmicpc.net

암호해석 가능한 것은 두가지 경우가 있다 
현재 인덱스에 해당하는 숫자를 한 숫자로 볼것인지 or 한칸 앞의 숫자와 합해서 두자리숫자로 볼것인지이다. 

dp[i] 에는 i 번째 숫자까지의 해석이 x개가 있다면 x개 값을 저장한다. 문제에서도 아주 큰 값이 나올 수 있다고 광고를 하고 있으니 dp가 좋은 해결방법이라고 생각했다 

i) 현재 확인중인 인덱스에 해당하는 숫자를 한자리 수로 해석 

2 5 1 1 4 라는 암호가 주어졌을 때 
예를들어 모든 자리를 한자리 숫자로 본다면 2 / 5 / 1 / 1 / 4라고 할 수 있을 것이다. 

 

if int(data[i - 1]) > 0:  # 1~ 9
    dp[i] += dp[i - 1]  # 2 / 4/ 1/ 1/ 4 -> 1가지

 

ii) 현재 확인중인 인덱스를 일의 자리숫자, 인덱스 한칸 앞의 숫자를 십의 자리라고 보고 두자리수로 해석 

25 / 11 / 4 , 2 / 5/ 1 / 14 ..이런 경우들이 있을 것이다. 문제에서 A ~ Z가 1 ~ 26라고 했으며, 일의자리는 위의 if문에서 확인중이니 10 ~ 26를 범위로 설정했다. 

if 10 <= int(data[i - 2]) * 10 + int(data[i - 1]) <= 26:  # 두자리수가 1 ~ 26 이면 25/11/4 이런식으로 나눌 수 있음
    dp[i] += dp[i - 2]


iii) 또한 암호가 무조건 틀릴 수 밖에 없는 경우가 있다. 
-> 0번째 인덱스가 '0' 이면 틀리다. 
-> 다른 인덱스에 '0' 이 들어간다면 202010 은 20, 20, 10 과 같이 두자리수로 해석가능하므로 틀린 암호는 아니다 
-> 30, 40.. 의 경우

10 <= int(data[i - 2]) * 10 + int(data[i - 1]) <= 26

조건절에서 걸러진다. 

 

전체 코드

data = input()
n = len(data)
dp = [0] * (n+1)

dp[0] = 1 # 25 를 저장하기 위해서
dp[1] = 1
flag = True
if data[0] == '0': # 암호가 틀릴 수 밖에 없는 경우이다 0번쨰 인덱스에 0이면 틀리다 다른 인덱스에는 0이 들어가도 10,20 같은 경우가 있음
    flag = False    # 30 , 40 .. 의 경우에는 15번째 줄에서 걸러지게 됨 
for i in range(2, n + 1):
    if int(data[i - 1]) > 0:  # 1~ 9
        dp[i] += dp[i - 1]  # 2 / 4/ 1/ 1/ 4 -> 1가지

    if 10 <= int(data[i - 2]) * 10 + int(data[i - 1]) <= 26:  # 두자리수가 1 ~ 26 이면 25/11/4 이런식으로 나눌 수 있음
        dp[i] += dp[i - 2]


if flag:
    print(dp[n]%1000000)
else:
    print(0)

 

728x90

'Algorithm (PS)' 카테고리의 다른 글

[프로그래머스] MySQL 상품 별 오프라인 매출 구하기  (0) 2023.01.05
[프로그래머스] MySQL 조건에 맞는 도서와 저자 리스트 출력하기  (0) 2023.01.05
[백준] 7570번: 줄세우기 Python - Greedy/DP  (0) 2023.01.03
[프로그래머스] 수식최대화 Python  (0) 2023.01.01
[백준] 15666번: N과 M (12) Python - 조합,구현  (0) 2023.01.01
'Algorithm (PS)' 카테고리의 다른 글
  • [프로그래머스] MySQL 상품 별 오프라인 매출 구하기
  • [프로그래머스] MySQL 조건에 맞는 도서와 저자 리스트 출력하기
  • [백준] 7570번: 줄세우기 Python - Greedy/DP
  • [프로그래머스] 수식최대화 Python
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minji's engineering noteData Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • 백트래킹
  • 스파크
  • Swift
  • 리눅스
  • 백준
  • dp
  • EC2
  • 데이터브릭스
  • python
  • 프로그래머스
  • linux
  • Kubernetes
  • 알고리즘
  • 코딩테스트
  • 데이터엔지니어
  • 데이터엔지니어링
  • Databricks
  • ansible
  • docker
  • 빅데이터
  • AWS
  • 쿠버네티스
  • SPARK
  • Leetcode
  • dfs
  • 파이썬
  • 카카오코딩테스트
  • 클라우드
  • BFS
  • 운영체제

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
백준 2011번 : 암호코드 파이썬/Python - DP
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.