[백준][Python] 14584. 암호 해독
Silver Ⅳ 🔗14584. 암호 해독
📝문제 요약
문제
로마의 장군 카이사르는 로마군의 작전을 적이 모르게 하기 위하여 암호를 사용했다. 카이사르는 다음과 같이 문장에 있는 모든 알파벳 글자를 몇 칸 뒤의 알파벳으로 바꾸는 방식으로 암호를 만들었다. 아래 표는 모든 글자를 17칸 뒤의 알파벳으로 바꿨을 때 각 글자가 어떤 알파벳으로 바뀌는지 나타낸 표이다.
이 방법에 따라 ‘Baekjoon Online Judge’를 암호화하면 ‘Srvbaffe Feczev Aluxv’가 된다.
당신은 페르시아 군대의 장군으로서 카이사르의 암호를 해독해야 한다. 당신은 카이사르가 어떤 방법으로 문장을 암호화하는지는 알고 있지만 카이사르가 몇 칸 뒤의 알파벳으로 바꾸는지는 모른다. 다행히, 당신의 부하가 로마어 사전을 가져와서 이를 통해 카이사르의 암호를 해독할 수 있을 것으로 보인다. 보통 전령에는 보편적인 단어가 나오기 때문에 사전에 나오는 단어가 반드시 있을 것이다. 따라서 암호를 해독한 후, 해독한 문장에서 사전에 나오는 단어가 반드시 하나 이상 등장해야 한다.
카이사르의 암호와 사전의 정보가 주어졌을 때, 암호를 해독하는 프로그램을 작성하여라.
입력
첫 번째 줄에 암호문이 주어진다. 암호문은 소문자로만 이루어진 길이 100 이하의 문자열이다.
두 번째 줄에는 사전에 있는 단어의 수 N이 주어진다. (1 ≤ N ≤ 20)
세 번째 줄부터 N개의 줄에는 사전에 있는 단어가 주어진다. 모든 단어는 소문자로만 이루어진 길이 20 이하의 문자열이다.
출력
암호문을 해독하여 나온 원문을 출력한다. 모든 데이터에 대해서 답이 한 가지인 경우만 들어온다고 가정한다.
✏️문제 풀이
- 입력
- 첫 번째 줄 : 암호문(
word
) - 두 번째 줄 : 사전에 있는 단어의 수 (
n
) - 세 번째 줄 ~ : 사전에 있는 단어를 리스트(
dictionary
)에 저장
- 첫 번째 줄 : 암호문(
- 단어를 찾았는 지 확인할 플래그
found
초기값은False
- 문자열을 이동하면서 확인
- 해독한 문자열을 저장할
new_word
초기화 word
를 순회하며 문자열을 해독- 아스키 코드를 사용하여 문자를 왼쪽으로
shift
만큼 이동 a
보다 작아지면(ord(new_char) < 97
) 알파벳 끝으로 되돌려줌 :chr(ord(new_char) + 26)
- 해독한 문자열으로 변환한 문자를
new_word
에 추가
- 아스키 코드를 사용하여 문자를 왼쪽으로
dictionary
를 순회하며 해독한 문자열에 단어가 포함되는지 확인- 발견되었으면 플래그를
True
로 설정 - 확인 루프 종료
- 발견되었으면 플래그를
found
가True
라면 더 확인할 필요가 없으니 루프 종료
- 해독한 문자열을 저장할
- 원문 해독 결과 출력
코드와 함께 보는 풀이
# 암호문 입력
word = input()
# 사전에 있는 단어의 수 입력
n = int(input())
# 사전에 포함된 단어들을 입력 받아 리스트에 저장
dictionary = [input() for _ in range(n)]
# 사전 단어가 발견되었는지 여부를 저장하는 플래그
found = False
# 이동을 하면서 확인
for shift in range(0, 25):
# 해독한 문자열을 저장할 new_word 초기화
new_word = ''
# word 를 순회하며 문자열을 해독
for char in word:
# 문자를 왼쪽으로 shift만큼 이동
new_char = chr(ord(char) - shift)
# a보다 작아지면 알파벳 끝으로 되돌려줌
if ord(new_char) < 97:
new_char = chr(ord(new_char) + 26)
# 해독된 문자 추가
new_word += new_char
# 해독된 문자열에 사전 단어 중 하나라도 포함되어 있는지 확인
for dic in dictionary:
# 발견되었으면 플래그를 True로 설정하고 확인 루프 종료
if dic in new_word:
found = True
break # 사전 확인 루프 종료
# 플래그를 True이면 더 확인할 필요가 없으므로 해독 루프 종료
if found:
break
# 원문 해독 결과 출력
print(new_word)
💯제출 코드
word = input()
n = int(input())
dictionary = [input() for _ in range(n)]
found = False
for shift in range(0, 25):
new_word = ''
for char in word:
new_char = chr(ord(char) - shift)
if ord(new_char) < 97:
new_char = chr(ord(new_char) + 26)
new_word += new_char
for dic in dictionary:
if dic in new_word:
found = True
break
if found:
break
print(new_word)
댓글남기기