Home 14584번(암호 해독)
Post
Cancel

14584번(암호 해독)

첫 시도

  • 암호문의 길이는 100 이하, N은 20, N의 길이는 20이다.
  • 문제를 해결하기 위해 해야하는 작업이 2가지가 있다
    1. 암호문의 모든 문자를 한칸 씩 옆으로 옮기기 -> 모든 경우를 확인해야 하기 때문에 26번 반복
    2. 사전에 등록된 단어가 해독된 문자열에 있는지 확인, 1개라도 있으면 해당 문자열이 잘 해독된 문자열
  • 시간복잡도는 26 * (100 + (20 * 20)) -> 26 * 4 * 10^4

해결

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine(); // 암호문

        int N = Integer.parseInt(br.readLine());
        String[] words = new String[N]; // 사전에 있는 단어들
        String result = "";
        for(int i = 0; i < N; i++){
            words[i] = br.readLine();
        }
        for(int i = 1; i < 26 + 1; i++){ // 알파벳 갯수가 26개, 모든 경우의 수를 확인
            String pw = "";
            for(int j = 0; j < str.length(); j++){
                char alpa = (char) (str.charAt(j)+i); // char a = 'a';일때 a + 1 은 98, 즉 'b'다. 
                if(alpa > 122) alpa -= 26; // z를 벗어나면 a로 돌아가게 구현
                pw += alpa;
            }

            for(int j = 0; j < N; j++){
                if(pw.contains(words[j])){ // 해독된 암호에 사전의 문자가 있는지 확인
                    result = pw;
                    break;
                }
            }
        }
        System.out.println(result);
    }
}

참고

  • 직접구현
This post is licensed under CC BY 4.0 by the author.