[BOJ_11655]ROT13

문제

ROT13은 카이사르 암호의 일종으로 영어 알파벳을 13글자씩 밀어서 만든다.

예를 들어, "Baekjoon Online Judge"를 ROT13으로 암호화하면 "Onrxwbba Bayvar Whqtr"가 된다. ROT13으로 암호화한 내용을 원래 내용으로 바꾸려면 암호화한 문자열을 다시 ROT13하면 된다. 앞에서 암호화한 문자열 "Onrxwbba Bayvar Whqtr"에 다시 ROT13을 적용하면 "Baekjoon Online Judge"가 된다.

ROT13은 알파벳 대문자와 소문자에만 적용할 수 있다. 알파벳이 아닌 글자는 원래 글자 그대로 남아 있어야 한다. 예를 들어, "One is 1"을 ROT13으로 암호화하면 "Bar vf 1"이 된다.

문자열이 주어졌을 때, "ROT13"으로 암호화한 다음 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 알파벳 대문자, 소문자, 공백, 숫자로만 이루어진 문자열 S가 주어진다. S의 길이는 100을 넘지 않는다.

출력

첫째 줄에 S를 ROT13으로 암호화한 내용을 출력한다.

예제 입력 1 복사

Baekjoon Online Judge

예제 출력 1 복사

Onrxwbba Bayvar Whqtr

예제 입력 2 복사

One is 1

예제 출력 2 복사

Bar vf 1

풀면서 느낀점

ord() 와 chr() 을 이용해서 unicode 변환을 적절하게 수행하는 문제였다.

유니코드 숫자가 잘 기억이 나지 않는다면 우선 ord를 이용해 범위를 구해준다음 문제를 풀어보았다.

# A~Z = 65~90
# a~z = 97~122

다음 알파벳끼리 로테이션을 돌려야하기때문에 +13을 해줬을때 다시 a 혹은 A로 돌아가야 하기 때문에 분기처리로 Z 혹은 z 이상의 유니코드를 가지고 있다면 로테이션돌려주는 코드를 넣어줬다

아 그리고 isupper() 는 대문자 , islower() 는 소문자인지 boolean 타입으로 알려주는 메소드다

words = list(input())

# A~Z = 65~90
# a~z = 97~122

result = ''
for word in words:
    num = ord(word) + 13
    if word.isupper():
        if num > 90:
            result += chr(num - 90 + 64)
        else:
            result += chr(num)
    elif word.islower():
        if num > 122:
            result += chr(num - 122 + 96)
        else:
            result += chr(num)
    else:
        result += word
print(result)

좋은 웹페이지 즐겨찾기