
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
문제링크
이거 도저히 이해가 안 돼서 다른 사람 코드 훔쳐봤어요(고해성사)
풀이
def solution(s, n):
answer = ''
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lower = 'abcdefghijklmnopqrstuvwxyz'
for i in range(len(s)):
if s[i] == ' ':
answer += ' '
elif s[i].isupper():
answer += upper[(upper.index(s[i]) + n) % 26]
else:
answer += lower[(lower.index(s[i]) + n) % 26]
return answer
이해를 함 해보자..
for i in range(len(s)):
if s[i] == ' ':
answer += ' '
elif s[i].isupper():
answer += upper[(upper.index(s[i]) + n) % 26]
s[0] → A
upper.index(A) → 0
index + n 만큼 밀어야하니까 upper.index(0 + 1) → B
% 26 'Z'처럼 끝문자면 다시 앞에서 시작하게 조정
upper.index(25 + 1) % 26 = 0 → 'A'이해완입니다
대문자일 경우만 이해되면 아래는 쉽당 소문자인 경우는 소문자 리스트로 찾으면 되는 거니까 동일한 방식으로 써주면 끝이다!
다른사람 풀이
def solution(s, n):
result = ''
for char in s:
if char.isupper():
# 대문자 범위: A(65) ~ Z(90)
result += chr((ord(char) - ord('A') + n) % 26 + ord('A'))
elif char.islower():
# 소문자 범위: a(97) ~ z(122)
result += chr((ord(char) - ord('a') + n) % 26 + ord('a'))
else:
# 공백은 그대로
result += char
return result
문자를 유니코드/아스키코드로 바꿔주는 함수
ord('A') → 65
해당 숫자에 해당하는 문자로 바꿔주는 함수
chr('65') → 'A'