[백준] 2011번 - 암호코드 (Gold 5)
업데이트:
문제 링크
문제 설명
평문을 A를 1로, B를 2로, $\cdots$, Z를 26으로 암호화한다.
암호문이 주어졌을 때, 가능한 평문의 개수를 1000000으로 나눈 나머지를 출력한다.
정답 코드 및 설명
암호문 arr[]를 앞에서부터 i번째까지 끊었을 때 가능한 평문의 개수 count[i]로 점화식을 세운다.
i+2번째까지 끊었을 때 가능한 평문의 개수 count[i+2]를 구해보자.
- 평문의 마지막 문자가 암호문의 마지막 한자리 숫자를 복호화 한 문자인 경우
- 암호문의 마지막 자리가 0이어서는 안된다.
- 위 조건을 만족한다면 count[i+1]가지의 평문이 가능하다.
- 평문의 마지막 문자가 암호문의 마지막 두자리 숫자를 복호화 한 문자인 경우
- 암호문의 마지막 두 자리가 10 이상 26 이하이다.
- 위 조건을 만족한다면 count[i]가지의 평문이 가능하다.
이를 코드로 구현하면 아래와 같다.
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
46
47
48
49
50
51
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ2011 {
int[] arr;
void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String enc = br.readLine();
arr = new int[enc.length()];
for (int i = 0; i < arr.length; i++)
arr[i] = enc.charAt(i) - '0';
}
int dp() {
int[] count = new int[arr.length + 1];
count[0] = 1;
for (int i = 1; i <= arr.length; i++) {
// 첫 한 글자인 경우
if (i == 1) {
if (arr[i - 1] == 0) return 0;
count[i] = 1;
continue;
}
// 뒤의 두 자리가 문자로 변환되지 않는 경우
if (arr[i - 2] * 10 + arr[i - 1] > 26 || arr[i - 2] == 0) {
if (arr[i - 1] == 0) return 0;
count[i] = count[i - 1];
continue;
}
// 뒤의 두 자리가 문자로 변환이 가능한 경우
count[i] = count[i - 2];
if (arr[i - 1] != 0) {
count[i] += count[i - 1];
count[i] %= 1000000;
}
}
return count[arr.length];
}
void solution() throws IOException {
input();
System.out.println(dp());
}
public static void main(String[] args) throws IOException {
new BOJ2011().solution();
}
}
댓글남기기