본문 바로가기

Algorithm & SQL/Baekjoon

[Algorithm] [Python] 백준/BOJ - 11655_ROT13

11655 - ROT13


 

INDEX


1.문제 설명

2.입력

3.출력

4.예제 입출력

5.제출 코드

6.코드 설명


문제 설명


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으로 암호화한 내용을 출력한다.

 

예제 입출력


입력: Baekjoon Online Judge

출력: Onrxwbba Bayvar Whqtr

 

제출 코드


from sys import stdin

upper_case = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z']

lower_case = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p',
'q','r','s','t','u','v','w','x','y','z']

arr = list(stdin.readline().rstrip())

for i in range(len(arr)):
    if arr[i] in upper_case:
        idx = upper_case.index(arr[i])
        idx += 13
        if idx > 25:
            idx %= 25 +1
        arr[i] = upper_case[idx]
    elif arr[i] in lower_case:
        idx = lower_case.index(arr[i])
        idx += 13
        if idx > 25:
            idx %= 25 +1
        arr[i] = lower_case[idx]

print("".join(arr))

코드 설명


대문자와 소문자 각각으로 이루어진 리스트를 생성한다.

이후 입력값들의 원소를 하나하나 순환하며 각 케이스에 맞는 분기를 진행한다.

현재 문자가 대,소문자 배열의 몇번째 인덱스에 위치하는지 해당 인덱스 값을 알아온 뒤, 13을 더해준다.

이때 만일, 인덱스값이 배열의 길이를 넘어선다면 모드 연산을 통해 인덱스값을 바로잡아 준다.

이후 해당 인덱스에 해당되는 문자로 치환해주는 과정을 전 문자 반복한다.