📒 Today I Learn/🐍 Python

[Python] 시저 암호 (chr, ord)

se0ehe 2024. 9. 11. 10:37

 

 

 

 

 

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

✳️ 코드 작성

🤔 코드 아이디어
1. 빈 문자열 변수를 지정한다.
2. for문으로 문자열 s를 순회한다.

3. 문자열 s가 공백일 때, 아닐 때를 조건문으로 구분한다.
4. 공백이 아닐 때, 문자열 s의 시저 암호를 찾기( + n )를 시도한다.
> 이 때, 아스키 코드를 활용해준다.
5. 대문자가 아니거나, 특수기호로 변환이 될 경우를 조건문으로 구분한다.
> 소문자는 소문자로 변환되어야 하고 대문자는 대문자로 시저 암호 법칙을 적용해야 하기 때문
> 아스키코드에 따르게 되면 대문자였던 문자가 소문자나 특수기호로 변환이 되기 때문에 이러한 조건이 필요
> 알파벳 개수만큼 빼준다.

아스키 코드표

아스키 코드표 출처

 

 

💟 코드 풀이

def solution(s, n):
    answer = ''
    for i in s:
        if i == " ":
            answer += " "
        else:
            k = chr(ord(i) + n)
            if k.isupper() != i.isupper() or not k.isalpha():
                k = chr(ord(k) - 26)
            answer += k
    return answer

 

🟣 변수 초기화

  • answer는 결과를 저장할 빈 문자열

 

🟣 for문을 통한 문자 순회

  • for i in s:는 문자열 s의 각 문자를 하나씩 순회

 

🟣 공백 처리

  • if i == " ":에서 공백 문자는 암호화하지 않고 그대로 추가
  • answer += " "는 공백을 결과 문자열에 추가

 

🟣 문자 암호화

  • 공백이 아닌 문자는 k = chr(ord(i) + n)에서 아스키 값을 n만큼 더한 후, chr 함수로 다시 문자로 변환
    • ord(i)는 문자를 아스키 코드로 변환하고, chr()는 다시 문자로 변환하는 함수

 

🟣 알파벳 범위 조정

  • 만약 변환된 문자가 원래와 다른 대소문자라면(k.isupper() != i.isupper()), 또는 알파벳이 아니라면(not k.isalpha())
    • 알파벳 범위를 넘어갔다고 판단하고 26을 빼서 다시 순환

 

🟣 결과 저장

  • 변환된 문자를 answer에 계속 추가

 

🟣 최종 반환

  • 모든 문자를 변환한 후, 완성된 암호화된 문자열을 반환

 

💠 예시

🔵 입력 예시

s = 'Az'
n = 3

 

 

🔵 빈 문자열 초기화 후 순회   for i in s: 

1️⃣ 첫 번째 문자 : 'A'

  • i = 'A'
  • if i == " ":
    • 문자가 공백인지 확인합니다. 'A'는 공백이 아니므로 이 조건은 건너뜀
  • k = chr(ord(i) + n)
    • ord('A')는 'A'의 아스키 값을 반환하는 함수, 'A'의 아스키 값은 65
    • 여기에 n = 3을 더하면 68
    • chr(68)은 아스키 값 68에 해당하는 문자 'D'
    • k = 'D'
  • if k.isupper() != i.isupper() or not k.isalpha():
    • k.isupper()는 'D'가 대문자인지 확인, 'A'도 대문자이므로, 둘 다 대문자로 대소문자가 일치
    • 그리고 'D'는 알파벳이므로 이 조건을 통과하여 추가적인 조정은 필요 없음
  • answer += k
    • 결과 문자열 answer에 'D'를 추가
    • answer = 'D'

 

2️⃣ 다음 문자 : 'z'

  • i = 'z'
  • if i == " ":
    • 'z'는 공백이 아니므로 조건을 건너뜀
  • k = chr(ord(i) + n)
    • ord('z')는 122, 여기에 n = 3을 더하면 125
    • chr(125)는 알파벳이 아니고 '}'라는 특수 문자
    • k = '}'
  • if k.isupper() != i.isupper() or not k.isalpha():
    • 변환된 k는 알파벳이 아니므로 not k.isalpha() 조건이 참
    • k = chr(ord('}') - 26)
      • ord('}') = 125이고, 여기에서 26을 빼면 99
      • chr(99)는 'c'
      • k = 'c'
  • answer += k
    • 변환된 문자 'c'를 결과 문자열에 추가
    • answer = 'Dc'

 

🔵 최종 반환 return answer

  • 모든 문자가 변환된 후 결과 문자열 'Dc'를 반환
solution('Az', 3) 
# 결과: 'Dc'