코딩테스트 준비/백준

[백준] 11655번 ROT13 - 파이썬(Python)

youjin86 2021. 8. 2. 23:46

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

 

11655번: ROT13

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

www.acmicpc.net

 

문제

 

21.02.26 접근법

 

z인 122를 넘어가면 26을 빼 다시 돌아가게 함.

대문자도 동일하게 적용

 

 

21.02.26 코드

s=input()
answer=''
for x in s:
    if 'a'<=x and x<='z':
        x=ord(x)+13
        if x>122:
            x-=26
        answer+=chr(x)
    elif 'A'<=x and x<='Z':
        x=ord(x)+13
        if x>90:
            x-=26
        answer+=chr(x)
    else:
        answer+=x

print(answer)

 

21.08.02 접근법

 

소문자 a의 아스키코드인 97을 기준으로, 대문자 A의 아스키코드인 65 기준으로 연산

 

chr(97+(ord(i)+13-97)%26) 수식 풀이

1. i를 아스키 코드로 변환 후 13을 더함.

2. 그 후, 97을 제외하고 26으로 나눴을 때 나머지를 구함.

(이유 -13을 더하다보면 아스키 코드에서 z를 넘어가게 됨. 이에, a부터 0으로 통일하기 위해 2와 같은 수식을 함.)

3. 97부터 2번에서 나온 값을 더하면 a부터 z를 벗어나지 않음.

4. 3의 값을 chr함수를 통해 다시 문자로 변환

 

(예시)

13을 더해 123이 나오면 122가 z이므로 범위를 벗어남.

때문에 2번의 수식을 대입하면 0이 나옴.

여기에 97+0을 해주면 a로 돌아가게 됨.

 

chr(65+(ord(i)+13-65)%26)인 대문자도 동일

 

/////

시간 계산을 위해 여러가지 시도를 해봄.

1. 2월 달에 한 알고리즘과 시간을 비교했을 때 비슷

2. 하나하나 print가 아닌 ans에 모아서 했을 때도 시간은 비슷

3. islower(), isupper() 함수가 아닌, 'a'<=i<='z', 'A'<=i<='Z'로 했을 때도 시간은 비슷

 

결론...!! 다 비슷했음. 하고싶은대로 하면 됨!!

 

 

21.08.02코드

arr=input()
ans=''
for i in arr:
    if i.islower():
        print(chr(97+(ord(i)+13-97)%26), end='')

    elif i.isupper():
        print(chr(65+(ord(i)+13-65)%26), end='')

    else:
        print(i,end='')