ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 14584번: 암호 해독
    코딩(Coding)/백준 문제풀이 2021. 1. 20. 11:30
    728x90

    링크: www.acmicpc.net/problem/14584

     

    14584번: 암호 해독

    로마의 장군 카이사르는 로마군의 작전을 적이 모르게 하기 위하여 암호를 사용했다. 카이사르는 다음과 같이 문장에 있는 모든 알파벳 글자를 몇 칸 뒤의 알파벳으로 바꾸는 방식으로 암호를

    www.acmicpc.net

    암호 해독

    문제

    로마의 장군 카이사르는 로마군의 작전을 적이 모르게 하기 위하여 암호를 사용했다. 카이사르는 다음과 같이 문장에 있는 모든 알파벳 글자를 몇 칸 뒤의 알파벳으로 바꾸는 방식으로 암호를 만들었다. 아래 표는 모든 글자를 17칸 뒤의 알파벳으로 바꿨을 때 각 글자가 어떤 알파벳으로 바뀌는지 나타낸 표이다.

    이 방법에 따라 ‘Baekjoon Online Judge’를 암호화하면 ‘Srvbaffe Feczev Aluxv’가 된다.

    당신은 페르시아 군대의 장군으로서 카이사르의 암호를 해독해야 한다. 당신은 카이사르가 어떤 방법으로 문장을 암호화하는지는 알고 있지만 카이사르가 몇 칸 뒤의 알파벳으로 바꾸는지는 모른다. 다행히, 당신의 부하가 로마어 사전을 가져와서 이를 통해 카이사르의 암호를 해독할 수 있을 것으로 보인다. 보통 전령에는 보편적인 단어가 나오기 때문에 사전에 나오는 단어가 반드시 있을 것이다. 따라서 암호를 해독한 후, 해독한 문장에서 사전에 나오는 단어가 반드시 하나 이상 등장해야 한다.

    카이사르의 암호와 사전의 정보가 주어졌을 때, 암호를 해독하는 프로그램을 작성하여라.

    입력

    첫 번째 줄에 암호문이 주어진다. 암호문은 소문자로만 이루어진 길이 100 이하의 문자열이다.

    두 번째 줄에는 사전에 있는 단어의 수 N이 주어진다. (1 ≤ N ≤ 20)

    세 번째 줄부터 N개의 줄에는 사전에 있는 단어가 주어진다. 모든 단어는 소문자로만 이루어진 길이 20 이하의 문자열이다.

    출력

    암호문을 해독하여 나온 원문을 출력한다. 모든 데이터에 대해서 답이 한 가지인 경우만 들어온다고 가정한다.


    문제 접근

    해당 문제는 아스키코드를 이용해서 암호화한 문자를 입력된 단어들과 비교하면 될거 같았다. 일단 알파벳은 26개인데, 문제에서 소문자로만 이루어져있다고 하니까 소문자 26개만 고려하면 될것이다.

    출처: https://velog.io/@gndan4/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%95%84%EC%8A%A4%ED%82%A4-%EC%BD%94%EB%93%9C-%EA%B4%80%EB%A0%A8-%ED%95%A8%EC%88%98

    아스키코드표를 보면 a~z까지 97~122까지이다. 이점을 이용해서 복호화를 하면되는데, 문제는 몇칸뒤의 알파벳을 사용했는지를 모른다는 것이다. 여기서는 그냥 1부터 26까지 다 돌려보는 수 밖에 없다.

     

    1. 입력으로 들어온 암호화된 단어를 n칸뒤 알파벳을 선택했다는 가정하에 1부터26까지 다 탐색한다.

    2. 각각의 n의 경우에서 입력으로 들어온 단어가 포함되는지 확인한다.

    3. 복호화한 단어에 입력으로 들어온 단어가 있으면 n칸뒤의 알파벳을 선택한 것이므로 해당 복호화 문자를 리턴한다.

    위 같은 순서로 코드를 작성하면 될것이다.


    코드

    """
    백준 알고리즘 14584번: 암호 해독
    https://www.acmicpc.net/problem/14584
    """
    import sys
    
    def calc(key, n, words):
        for i in range(26):
            temp = ""
            for k in key:
                #1~26까지 카이사르 복호화한 것을 탐색해봄
                temp += chr(((ord(k)-97+i)%26)+97)
    
            for k in range(n):
                if words[k] in temp: # 해당 문자열이 temp에 포함되어있는지 확인
                    return temp
    
    def main():
        key = sys.stdin.readline()[:-1]
        n = int(sys.stdin.readline())
        words = []
        for i in range(n):
            word = input()
            words.append(word)
    
        print(calc(key, n, words))
    
    if __name__ == "__main__":
        main()
    728x90

    '코딩(Coding) > 백준 문제풀이' 카테고리의 다른 글

    [백준] 2747번: 피보나치 수  (0) 2021.01.25
    [백준] 1049번: 기타줄  (0) 2021.01.22
    [백준] 2839번: 설탕 배달  (0) 2021.01.18
    [백준] 10870번: 피보나치 수 5  (0) 2021.01.12
    [백준] 1912번: 연속합  (0) 2021.01.12

    댓글

Designed by black7375.