공부하기/백준

[Python] 백준 풀기 11655 - ROT13

XEV 2022. 12. 30. 23:28

파이썬 백준 11655번

브론즈 1

https://www.acmicpc.net/problem/11655

 

11655번: ROT13

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

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 구현, 문자열

 

 

 

 

 

문제 풀기

개별 알파벳 문자를 ASCII 코드와 대응하는 10진수로 변환한다.

변환된 숫자로 기준이될 10진수 위치를 0에 고정하여 +13 쉬프트 시키고 26으로 나눈 나머지를 통해 Z 이후의 알파벳의 숫자를 재조정한다.

            c = ((c - 65) + 13) % 26 + 65

            c = ((c - 97) + 13) % 26 + 97

10진수를 다시 알파벳으로 변환하고 합쳐 출력한다.

 

 

input() 을 이용하면 앞 뒤 공백을 입력 받는데 편하였으나, 어떻게든 readline() 으로 받겠다 꺽이지 않는 나의 마음으로 인해 조금의 뻘짓이 첨가되었다.

 

 

 

 

 

코드 보기

제출한것

import sys
inputdata = sys.stdin.readline


def fnROT13():
    new_s_ls = []
    for s in s_ls:
        if s.isupper() == True and 65 <= ord(s) <= 90:
            c = ord(s)
            c = ((c - 65) + 13) % 26 + 65
            new_s_ls.append(chr(c))
        elif s.islower() == True and 97 <= ord(s) <= 122:
            c = ord(s)
            c = ((c - 97) + 13) % 26 + 97
            new_s_ls.append(chr(c))
        else:
            new_s_ls.append(s)
    new_s_ls.pop()
    print(new_s_ls)     # TEST PRINT
    print("".join(new_s_ls))


if __name__ == "__main__":
    # s_ls = list(map(str, inputdata().strip()))
    s_ls = list(inputdata())
    # s_ls = input()
    print(s_ls)         # TEST PRINT
    
    fnROT13()

 

 

 

 

 

추가 하기

import sys
inputdata = sys.stdin.readline


def fnROT13():
    new_s_ls = []
    for s in s_ls:
        if s.isupper() == True and 65 <= ord(s) <= 90:          ## 대문자 그리고 ASCII 범위, 제출하고 보니 중복.
            c = ord(s)          ## ASCII 10진수 변환.
            c = ((c - 65) + 13) % 26 + 65           ## 65 ~ 90 구간에 맞추기 위한.
            new_s_ls.append(chr(c))
        elif s.islower() == True and 97 <= ord(s) <= 122:       ## 소문자 그리고 ASCII 범위, 제출하고 보니 중복.
            c = ord(s)          ## ASCII 10진수 변환.
            c = ((c - 97) + 13) % 26 + 97           ## 97 ~ 122 구간에 맞추기 위한.
            new_s_ls.append(chr(c))
        else:                                                   ## 대문자 소문자도 아닌 숫자, 공백 등등.
            new_s_ls.append(s)
    new_s_ls.pop()              # 이 악물고 readline 쓰겠다는 뻘짓의 결과.
    print(new_s_ls)     # TEST PRINT
    print("".join(new_s_ls))


if __name__ == "__main__":
    # s_ls = list(map(str, inputdata().strip()))            # 제출 "출력 형식이 잘못되었습니다"
    s_ls = list(inputdata())    # 이 악물고 readline 쓰겠다는 뻘짓의 결과.
    # s_ls = input()            # input() 쓰면 앞뒤 공백 입력받는것 쉽게 해결됨.
    print(s_ls)         # TEST PRINT
    
    fnROT13()



# One is 1

# ['O', 'n', 'e', ' ', 'i', 's', ' ', '1', '\n']
# ['B', 'a', 'r', ' ', 'v', 'f', ' ', '1']

# Bar vf 1


#   a a a  
  
# [' ', ' ', 'a', ' ', 'a', ' ', 'a', ' ', ' ', '\n']
# [' ', ' ', 'n', ' ', 'n', ' ', 'n', ' ', ' ']
#   n n n