import sys
input = sys.stdin.readline().rstrip("\n")
result = ""
for s in input:
if 'A' <= s <= 'Z':
if s <= 'M':
result += chr(ord(s) + 13)
else:
result += chr(ord(s)-13)
elif 'a' <= s <= 'z':
if s <= 'm':
result += chr(ord(s) + 13)
else:
result += chr(ord(s) - 13)
else:
result += s
print(result)
일단 이 문제의 이름인 'ROT13'은 영어 알파벳을 13글자씩 밀어서 만드는 암호이고 알파벳이 아닌 글자는 원래 글자 그대로 남아 있어야 한다.
알파벳을 순서대로 나열해보자.
A B C D E F G H I J K L M(13) N O P Q R S T U V W X Y Z(26) (아스키코드: 65-90)
a b c d e f g h i j k l m(13) n o p q r s t u v w x y z(26) (아스키코드: 97-122)
문자를 암호화하는 과정
(1) 해당 문자를 아스키코드 값으로 변환한다.
(2) 13칸을 알맞게 움직인다.
(3) 아스키코드 값을 다시 문자로 변환한다.
(1) ord(): 특정한 한 문자를 아스키코드 값으로 변환해주는 함수
(2) 알파벳은 26개인데 "ROT13"은 13글자씩 밀어서 만드는 암호이니까 13번째 알파벳인 'M/m'을 기준으로 암호화를 해야 되는 문자가 'M/m'보다 앞일때는 +13을 하고 'M/m'보다 뒤일때는 -13을 해서 13칸을 알맞게 움직인다.
(3) chr(): 아스키코드 값을 문자로 변환해주는 함수
import sys
input = sys.stdin.readline().rstrip("\n")
result = ""
# input을 한글자씩 읽는다
for s in input:
# 대문자일때
if 'A' <= s <= 'Z':
# M보다 앞에 있는 문자인 경우 (A-M일때)
if s <= 'M':
# 문자를 아스키코드로 변환하고, 13칸을 움직인 다음, 아스키코드 값을 다시 문자로 변환
result += chr(ord(s) + 13)
else: # (N-Z일때)
result += chr(ord(s)-13)
# 소문자일때
elif 'a' <= s <= 'z':
# m보다 앞에 있는 문자인 경우 (a-m일때)
if s <= 'm':
# 문자를 아스키코드로 변환하고, 13칸을 움직인 다음, 아스키코드 값을 다시 문자로 변환
result += chr(ord(s) + 13)
else: # (n-z일때)
result += chr(ord(s) - 13)
# 다른 문자일때 (숫자나 기호)
else:
result += s
print(result)
확실히 파이썬이 여러 함수가 있어서 편한거 같긴 하다! 다만 아직은 내가 여러 함수를 잘 모르지만ㅎㅎ