어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
| s | n | return |
|---|---|---|
| "AB" | 1 | "BC" |
| "z" | 1 | "a" |
| "a B z" | 4 | "e F d" |
알파벳을 string.ascii_lowercase, string.ascii_uppercase를 이용하여 나열하고 해당 list의 index를 이용하여 풀기
- 같은 조건문이 반복되어 중복되는 부분이 많아진다는 단점이 있었다.
- 코드의 가독성이 좋지 않았다.
import string
def solution(s, n):
answer = ''
alpha = list(string.ascii_lowercase)
ALPHA = list(string.ascii_uppercase)
for i in s:
if ord(i) == 32:
answer.append(" ")
# 대문자인 경우
elif ord(i) <= 90:
if ALPHA.index(i) + n > 25:
index = ALPHA.index(i) + n - 25
answer.append(index)
else:
answer.append(ALPHA[ALPHA.index(i) + n])
# 소문자인 경우
else:
if alpha.index(i) + n > 25:
index = alpha.index(i) + n - 25
answer.append(index)
else:
answer.append(alpha[alpha.index(i) + n])
return answer
아스키 코드값을 이용하여 연산을 통해 변환하기
- ord()를 이용하여 문자값을 아스키코드로 바꾸고, chr()을 통해 다시 아스키코드값을 문자로 바꿔준다.
- 대문자일 경우는 소문자로, 소문자일 경우에는 대문자로 바꿔주는 조건문을 통해 a라는 list에 값을 넣어주고, 마지막에 join()을 통해 연결해줬다.
def solution(s, n):
a = list(s)
for i in range(len(s)):
if ord(a[i]) == 32:
a[i] = " "
elif a[i].isupper():
a[i] = chr((ord(a[i]) + n - 65) % 26 + 65)
elif a[i].islower():
a[i] = chr((ord(a[i]) + n - 97) % 26 + 97)
return "".join(a)
- string형에서는 replace나 append가 사용 불가능 하다. 이는 오직 list형에서 사용할 수 있다. (string 형과 list형 구분하는 것 연습하기)
- .upper(), .lower() 함수는 각각 알파벳을 대문자 혹은 소문자로 변경해준다.