티스토리 뷰

 

문제 링크 : https://www.acmicpc.net/problem/2011

 

2011번: 암호코드

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

www.acmicpc.net

 

입력을 문자열 str 로 받아서 처리한다.

p 를 문자열에서 현재 처리할 index 라 하자.

dp[p] 는 p 를 시작 위치로 하는 부분 문제의 결과값을 의미한다.

세 가지 가능성이 있다.

 

1. 더 이상 진행이 불가능한 경우 -> str[p] 가 '0' 

이 경우 해당 수를 알파벳에 대응시킬 방법이 없다.

더 이상 진행하지 않고 return 0 을 하면 된다.

가짓수를 세는 문제니 0 을 돌려준다는 것은 불가능하다는 의미.

 

2. 해당 수 하나를 알파벳에 대응시키는 경우 -> str[p] 가 '0' 가 아니면 언제나 가능

1~9 까지에 해당되는 A~I 로 변환하면 된다.

 

3. 해당 위치와 그 다음의 수를 합쳐서 하나의 알파벳에 대응시키는 경우

이 경우 str[p] 는 1 이거나 2 여야 하고, 

str[p] 가 2 인 경우는 str[p+1] 이 6 이하여야 한다.

deal 함수가 처리한다.

 

#include<bits/stdc++.h>

using namespace std;

const int mmod=1e6;
string str;
int sz, dp[5000];

bool deal(int p){
    if(p+1>=sz) return false;
    if(str[p]-'0'>2) return false;
    if(str[p]=='2' && str[p+1]-'0'>6) return false;
    return true;
}

int recur(int p){
    if(p==sz) return 1;
    if(str[p]=='0') return 0;
    
    int &ret=dp[p];
    if(ret!=-1) return ret;
    
    ret=0;
    ret+=recur(p+1);  // 하나의 수를 하나의 알파벳에 대응
    if(deal(p))
        ret+=recur(p+2);  // 두 개의 수를 하나의 알파벳에 대응 (가능한 경우에) 
    
    ret%=mmod;
    return ret;
}

int main(){
    memset(dp,-1,sizeof dp);
    cin >> str;
    sz=str.length();
    
    printf("%d\n",recur(0));
}

 

 

 

반응형

'DS\Algo > Dynamic Programming' 카테고리의 다른 글

BOJ 17626 Four Squares  (0) 2022.09.26
BOJ 7579 앱  (1) 2022.09.25
BOJ 12852 1로 만들기 2  (0) 2022.09.22
BOJ 17070 파이프 옮기기 1  (2) 2022.09.19
BOJ 10942 팰린드롬?  (0) 2022.09.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함