[코딩 테스트 연습] 시저 암호
문제
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
❗제한사항❗
- 공백은 아무리 밀어도 공백입니다.
- s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
- s의 길이는 8000이하입니다.
- n은 1 이상, 25이하인 자연수입니다.
입출력 예

✔풀이
def solution(s, n):
answer = ''
for index in range(len(s)):
if s[index] == " ":
answer+=s[index]
else:
new_alphabet = chr(ord(s[index])+n)
if ("a"<=s[index]<="z"and (new_alphabet > "z")) or (s[index]<="Z" and (ord(new_alphabet) > 90)):
new_alphabet = chr(ord(new_alphabet)-26)
answer+=new_alphabet
return answer
📝설명
문제에서 각 알파벳에서 n만큼 이동한 값의 문자를 출력하도록 요구하고 있다.
공백은 공백으로 출력하고, 알파벳은 대소문자를 구분하되, 대문자는 대문자로, 소문자는 소문자로 출력해야 한다.
for문을 통해 입력문인 s를 하나씩 꺼내보면서 문자열 answer을 만들어야겠다고 생각했다.
가장만만한 공백부터 다뤄놓고 알파벳을 고민해야겠다고 판단해서,for문을 통해 인덱스를 꺼냈다.
해당 문자열이 " "와 같다는 조건을 if문에 걸고, answer에 그 문자열(지금은 공백!)을 더하도록 한다.
남은 경우는 알파벳이 될텐데! else로 분류했다.
알파벳은 아스키 코드를 이용하여 숫자로도 변환이 가능해서, 아스키 코드를 이용하고자 했다.
이 때, ord()를 사용하면 알파벳이 숫자가 되고, chr()를 사용하면 숫자가 알파벳이 되게 해준다.
결과에 도출되어야 할 알파벳을 new_alphabet으로 정의하고 s[index]에 n만큼을 더한 값에 ord를 씌워 숫자로 만든 후, 다시 chr를 통하여 알파벳으로 전환시켰다.
아스키 코드에는 대문자 소문자 뿐만 아니라 다양한 기호들이 존재하고, 대문자가 소문자보다 앞에 있다.
따라서 대문자에 n을 더한 값이 소문자로 넘어가버릴수도 있으니 경우를 다시 두고 생각해야 한다.
만약 현재의 알파벳이 a~z사이에 있다면 소문자임을 짐작할 수 있고, new_alphabet이 z를 넘어가버리면 알파벳이 아닌 기호로 넘어가므로 26을 빼줘야 한다.
또한, 대문자인 경우를 고려했을 때는 s[index]가 Z 미만이고 새로운 알파벳의 아스키 코드가 Z를 의미하는 숫자 90보다 크다면 이 역시도 26을 빼줘야 한다.
이 부분이 else의 if문이다.
마지막으로 answer에 new_alphabet을 더해주면 결과를 도출할 수 있다.
👑모범 답안

🔎 isupper()과 islower()를 통해 알파벳 대소문자를 판단하고, 나머지 연산을 통하여 대소문자 안에서 도출할 수 있도록 했다.
후에 "".join을 통하여 문장을 연결했다......
👀느낀 점
: 나름 잘 풀었다고 생각했는데, isupper()과 isupper()을 통해 더 간단하게 대소문자를 구분할 수 있었다.
다음번에 알파벳이랑 숫자랑 가지고 놀게 된다면 그 땐 더 좋은 코드가 나올 수 있을 것 같다는 근자감을 느껴요...
문제를 그 전에는 하루에 많이 푸는 게 중요하다 생각했는데, 어느 순간부터 하루에 한 문제를 제대로 풀자 라는 생각을 갖게 됐다.
코드를 짜놓고도 더 나은 코드를 위해 고민하면서 시간을 더 많이 할애하고 있는데, 양은 줄었지만 나름 만족하고 있다.
잘해보자 아좌자..~
💻 문제 출처