시저 암호

수이·2025년 4월 15일

🟢 코드카타 / PYTHON

목록 보기
48/53
post-thumbnail

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "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)): 
  1. 문자열 길이만큼 반복문 돌린다 → ㅇㅋ
if s[i] == ' ':
    answer += ' '
  1. 공백이면 정답 빈 문자열에 추가 → ㅇㅋ
elif s[i].isupper():
	answer += upper[(upper.index(s[i]) + n) % 26]
  1. 여기서 헷갈렸는데

s[0] → A
upper.index(A) → 0
index + n 만큼 밀어야하니까 upper.index(0 + 1) → B

% 26 'Z'처럼 끝문자면 다시 앞에서 시작하게 조정

  • s = 'Z', n = 1, result = 'A'일 경우
    • Z index = 25
    • 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()

문자를 유니코드/아스키코드로 바꿔주는 함수

ord('A') → 65

chr()

해당 숫자에 해당하는 문자로 바꿔주는 함수

chr('65') → 'A'

0개의 댓글