링크: https://school.programmers.co.kr/learn/courses/30/lessons/12926
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
s | n | result |
---|---|---|
"AB" | 1 | "BC" |
"z" | 1 | "a" |
"a B z" | 4 | "e F d" |
문자열에 순서가 있는 걸로 아는데 어떻게 접근하지?
근데, a ~ z 리스트 내에서 일치하는 인덱스를 찾는 방법 말고 컴퓨터가 읽을 수 있게 숫자로 변환하는 내장함수가 있을 거 같다. 그래서 검색해봤더니 역시 있었다.
아스키코드
: 기호와 영문알파벳에 적합한 문자 인코딩
이미지 출처: https://namu.wiki/w/아스키 코드
a ~ z : 97 ~ 122
A ~ Z : 65 ~ 90
이제 문자열을 아스키코드(숫자)로 접근하는 방법을 알았으니 파이썬에서는 어떻게 적용하는지 알아보면
ord()
: 문자열을 아스키코드로 변환chr()
: 아스키코드를 문자열로 변환수도코드
위의 내용들을 활용해 수도코드를 만들어보면 다음과 같이 할 수 있을거 같다.
for i in s:
if i 는 공백이면:
답에 그대로 공백 추가
elif i 가 대문자이면:
if i 를 아스키코드로 변환하고 n 을 더했을 때 z 보다 크다면:
~ ~
else:
아스키코드로 변환 후 + n 한 것을 다시 문자열로 변환해서 답에 추가
elif i 가 소문자이면:
마찬가지
여기서 이제 생각해 봐야 할 점은
ex) s = ‘z’, n = 4 → 결과는 d 가 나와야 한다.
위의 로직들을 하나의 구문으로 합치면 완성
def solution(s, n):
answer = ''
for i in s:
if i == ' ':
answer += i
elif i.isupper():
if ord(i) + n > 90:
answer += chr((ord(i) + n - 91) + 65)
else:
answer += chr(ord(i)+n)
elif i.islower():
if ord(i) + n > 122:
answer += chr((ord(i) + n - 123) + 97)
else:
answer += chr(ord(i) + n)
return answer