뿌듯해 뿌듯해 아주 열심히 잘 풀었다 ㅎㅎㅎ 조금 제정신 아닌 상태에서 풀어서 이상한 곳에서 자꾸 삐끗삐끗했지만 ~ 결론은 풀었으니까 ~
import sys
string = list(sys.stdin.readline().rstrip())
answer = []
# 대문자: 65~90
# 소문자: 97~122
for i in string:
alpha = ord(i)
if (65<=alpha<=90):
new = alpha+13
if (new) > 90:
new -= 26
answer.append(chr(new))
new = 0
elif (97<=alpha<=122):
new = ord(i)+13
if (new) > 122:
new-= 26
answer.append(chr(new))
new = 0
else:
answer.append(i)
for i in answer:
print(i, end='')
알파벳 아스키코드는 외우고 있자... 사실 외워야지 !!! 라는 마음이 아니라 그냥 문제 풀다보면 너무 많이 나와서 자동으로 외워진다 ^^
하나하나 뜯어보자.
import sys
string = list(sys.stdin.readline().rstrip())
answer = []
일단 string을 list 형태로 하나하나 잘라서 받아주고, 답을 저장해둘 answer list도 하나 만들어둔다.
# 대문자: 65~90
# 소문자: 97~122
for i in string:
alpha = ord(i)
if (65<=alpha<=90):
new = alpha+13
if (new) > 90:
new -= 26
answer.append(chr(new))
new = 0
elif (97<=alpha<=122):
new = ord(i)+13
if (new) > 122:
new-= 26
answer.append(chr(new))
new = 0
else:
answer.append(i)
이제 string 하나하나를 분석해준다. 처음에는 if문에서 ord를 썼는데, 그것보다는 alpha에 값을 저장해두고 그걸 하나하나 불러오는 게 시간이 덜 걸릴 것 같아서 alpha라는 변수를 정의했다.
만약 alpha가 대문자의 아스키코드에 해당하는 65~90 이면 13을 더한 수를 new 변수에 저장한다. 이때 대문자는 대문자끼리 순환을 하니까 대문자의 Maximum인 90을 넘는다면 거기서 26을 빼준다. 그러면 91의 경우 65가 되어서 순환할 수 있다.
소문자 역시 같은 맥락으로 코드를 짰다.
그리고 만일 숫자, 공백 같은 알파벳이 아닌 문자가 들어왔을 때는 그 자체를 answer에 append 해준다.
이렇게 하면,
이렇게 된다.
저번에 나에게 신선한 충격(?)을 안겨주었던 분의 블로그를 참고하였다.
(출처: https://youjin86.tistory.com/45)
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)
전체적인 로직은 나와 비슷하지만, 문자열 자체로 for문을 돌린 것 같은 자잘한 부분이 나와 다르다.
오늘도 신기한 알고리즘의 세계 끄으으읕~!~!~!