BOJ

백준 2011 - 암호코드

yanJuicy 2019. 9. 14. 00:56
반응형

문제

 

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

 

2011번: 암호코드

문제 상근이와 선영이가 다른 사람들이 남매간의 대화를 듣는 것을 방지하기 위해서 대화를 서로 암호화 하기로 했다. 그래서 다음과 같은 대화를 했다. 상근: 그냥 간단히 암호화 하자. A를 1이라고 하고, B는 2로, 그리고 Z는 26으로 하는거야. 선영: 그럼 안돼. 만약, "BEAN"을 암호화하면 25114가 나오는데, 이걸 다시 글자로 바꾸는 방법은 여러 가지가 있어. 상근: 그렇네. 25114를 다시 영어로 바꾸면, "BEAAD", "YAAD", "

www.acmicpc.net

 

 

풀이

 

N자리의 암호가 주어질 때 N번째에 올 수 있는 암호는 1부터 9까지이고, N-1과 N번째에 10부터 26까지 올 수 있다. 

예를 들어, 5자리 암호 ○○● 일때 ●에는 1부터 9까지 올 수 있고, ● 에서 ●에는 10부터 26까지 올 수 있다.

 

따라서 d[n] = n자리 암호를 해석할 수 있는 가짓수 라고 할때,

기본적으로 d[n] = d[n-1](1~9가 올 경우) + d[n-2](10~26이 올 경우) 이 된다.

 

하지만 암호가 되지 않는 경우도 있는데 암호의 시작에 0이 들어가거나 0이 두번 연속 나오게 되면 암호가 될 수 없고, 또한 암호 중간에 0이 들어가면 10 또는 20으로만 해석을 해야해서 이에 대한 예외 처리가 필요하다.

01234 : 암호 해석 불가능

12003 : 암호 해석 불가능

12034 : 0 때문에 20으로만 해석 가능

 

그리고 두 자리 암호를 해석할 경우 해석된 숫자가 26이하일 경우에만 추가를 해야한다.

 

 

코드

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <string>
 
using namespace std;
 
string N;
int dp[5001];
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> N;
 
    // 암호의 시작이 0일 경우 해석 불가능
    if (N[0== '0'
    {
        cout << 0;
        return 0;
    }
 
    dp[0= dp[1= 1;
    
    for (int i = 2; i <= N.size(); i++)
    {
        char a = N[i - 1], b = N[i - 2];
        if (a == '0' && b =='0')    // 두 자리 연속 0인지 검사
        {
            cout << 0;
            return 0;
        }
        if (a != '0') dp[i] += dp[i - 1];   // i번째 숫자가 0이 아닐 경우 한 자리 숫자가 가능
        if (b != '0')   // i-1 번째 숫자가 0이 아닐 경우 두 자리 숫자가 가능
        {
            int num = (b - '0')*10 + (a - '0');
            if (num <= 26) dp[i] += dp[i-2];
        }
        dp[i] %= 1000000;
    }
 
    cout << dp[N.size()];
    return 0;
}
 
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 2146 - 다리 만들기  (1) 2019.09.21
백준 2178 - 미로 탐색  (0) 2019.09.14
백준 4963 - 섬의 개수  (0) 2019.09.02
백준 2667 - 단지번호붙이기  (0) 2019.08.29
백준 11653 - 소인수분해  (0) 2019.08.23