[기초] 백준 5598번: 카이사르 암호 (파이썬)

Donburi·2022년 5월 23일
0

PS (Old)

목록 보기
8/24

문제

가이우스 율리우스 카이사르(Gaius Julius Caesar)는 고대 로마 군인이자 정치가였다. 카이사르는 비밀스럽게 편지를 쓸 때, 'A'를 'D로', 'B'를 'E'로, 'C'를 'F'로... 이런 식으로 알파벳 문자를 3개씩 건너뛰어 적었다고 한다.

26개의 대문자 알파벳으로 이루어진 단어를 카이사르 암호 형식으로 3문자를 옮겨 겹치지 않게 나열하여 얻은 카이사르 단어가 있다. 이 카이사르 단어를 원래 단어로 돌려놓는 프로그램을 작성하시오.

입력

입력은 한 줄로 이루어져 있으며, 그 한 줄에는 대문자 알파벳으로 구성된 단어가 1개 있다. 단어는 최대 1000자 이하이다.

출력

입력받은 카이사르 단어를 원래 단어로 고친 걸 출력하시면 된다.

풀이

패턴이 고정적이라서 딕셔너리를 활용해서 풀었다.

d = {'A': 'X', 'B': 'Y', 'C': 'Z', 'D': 'A', 'E': 'B', 'F': 'C', 'G': 'D', 'H': 'E', 'I': 'F', 'J': 'G',
          'K': 'H', 'L': 'I', 'M': 'J', 'N': 'K', 'O': 'L', 'P': 'M', 'Q': 'N', 'R': 'O', 'S': 'P', 'T': 'Q', 'U': 'R',
          'V': 'S', 'W': 'T', 'X': 'U', 'Y': 'V', 'Z': 'W'}
str = input()
output = ''
for c in str:
    output += d[c]
print(output)

다른 방법의 풀이

chr()과 ord()를 활용한 풀이다. 시간상 더 효율적이다. 다른 사람의 풀이를 참고했다.

words = input()
for i in words:
	if ord(i) < 68:
    	print(chr(ord(i)+23), end='')
	if else:
    	print(chr(ord(i)-3), end='')

풀이 개선

네이밍과 메모리 활용에 더 신경을 써야겠다.

Caesar = {'A': 'X', 'B': 'Y', 'C': 'Z', 'D': 'A', 'E': 'B', 'F': 'C', 'G': 'D', 'H': 'E', 'I': 'F', 'J': 'G',
          'K': 'H', 'L': 'I', 'M': 'J', 'N': 'K', 'O': 'L', 'P': 'M', 'Q': 'N', 'R': 'O', 'S': 'P', 'T': 'Q', 'U': 'R',
          'V': 'S', 'W': 'T', 'X': 'U', 'Y': 'V', 'Z': 'W'}
str = input()
for c in str:
    print(Caesar[c], end='')

Reference

문제 선택: 코딩테스트 시작을 위한 백준 문제 추천
다른 방법의 풀이: [백준 5598] 카이사르 암호 Python

0개의 댓글