어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
제한사항 - 공백은 아무리 밀어도 공백입니다. - s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다. - s의 길이는 8000이하입니다. - n은 1 이상, 25이하인 자연수입니다.
문제 풀이
def solution(s, n):
answer = ''
alpha_u =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
alpha_l=[u.lower() for u in alpha_u]
for idx in range(len(s)):
if s[idx].isupper():
answer+=alpha_u[(idx+n)%26]
elif s[idx].islower():
answer+=alpha_l[(idx+n)%26]
else:
answer+=s[idx]
return answer
처음엔 이렇게 s 문자열의 인덱스를 가져와서 풀려고 했는데 테스트에서 첫번째것만 맞고 계속 틀렸음. 왜 틀렸나 생각해보니 s문자열의 인덱스와 리스트의 인덱스값이 같지가 않음...바보같은 실수를 하였다.
인덱스값을 기준으로 0과 마지막 원소가 붙어있는 원을 생각하며 풀었다. 결고 마지막 원소에서 다시 첫번째 원소로 가야하기 때문에 어떤 방법이 있을까 하다가 % 연산자를 기억해냄. 알파벳은 총 26글자이니 26로 나눈 나머지를 인덱스값으로 주면 마지막원소의 인덱스값이 와도 다시 0으로 리셋 가능함.
내코드
def solution(s, n):
answer = ''
alpha_u =['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
alpha_l=[u.lower() for u in alpha_u]
for a in s:
if a.isupper():
answer+=alpha_u[((alpha_u.index(a))+n)%26]
elif a.islower():
answer+=alpha_l[((alpha_l.index(a))+n)%26]
else:
answer+=a
return answer
def caesar(s, n):
s = list(s)
for i in range(len(s)):
if s[i].isupper():
s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
elif s[i].islower():
s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))
return "".join(s)
def solution(s, n):
answer = ''
for i in s:
if i:
if i >= 'A' and i <= 'Z':
answer += chr((ord(i) - ord('A') + n) % 26 + ord('A'))
elif i >= 'a' and i <= 'z':
answer += chr((ord(i) - ord('a') + n) % 26 + ord('a'))
else : answer += ' '
return answer
♣ ord 함수 & chr함수
ord 함수
- 문자를 해당 유니코드 코드 포인트(정수)로 변환하는 함수
chr 함수
- 유니코드 코드 포인트(정수)를 입력받아, 해당 값에 해당하는 문자를 반환하는 함수
def caesar(s, n):
lower_list = "abcdefghijklmnopqrstuvwxyz"
upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = []
for i in s:
if i is " ":
result.append(" ")
elif i.islower() is True:
new_ = lower_list.find(i) + n
result.append(lower_list[new_ % 26])
else:
new_ = upper_list.find(i) + n
result.append(upper_list[new_ % 26])
return "".join(result)