본문 바로가기
Coding Test

231101 시저암호 - Level 1

by mmm- 2023. 11. 1.

문제 설명

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.



제한사항

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

 

입출력 예


코드

def solution(s, n):
    answer = ''
    s_list = list(s)
    
    for i in range(len(s_list)):
        move = ord(s_list[i])+n
        
        if s_list[i] == " ":
            answer += " "
        elif 65 <= move and move <= 90 and s_list[i].isupper():
            answer += chr(move)
        elif 97 <= move and move <= 122 and s_list[i].islower():
            answer += chr(move)
        else:
            answer += chr(move - 26)
    
    return answer

 

풀이

문자열 s를 리스트로 변환 후, s_list 길이만큼 반복문을 돌리며 리스트에 있는 문자들을 하나씩 살핀다. 문자가 공백이면 answer에 공백을 추가해주고, 문자를 아스키코드로 변환하였을 때 65과 90 사이에 오고 문자가 대문자라면, 그리고 97과 122 사이에 오고 문자가 소문자라면 아스키 코드로 변환한 수에 n만큼 더해 다시 문자로 변환한 것을 answer에 더해준다. 그렇지 않다면 범위를 벗어나는 것이기 때문에 n만큼 더한 후 26을 빼주고 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)

s를 리스트로 변환하여 그 길이만큼 for문을 돌려주어 만약 s리스트의 i번째에 오는 문자가 대문자면 해당 문자를 아스키코드로 변환해 A의 아스키코드만큼 빼주고 n을 더한 값을 26으로 나눠 A의 아스키코드만큼 더해주고, 소문자면 해당 문자를 아스키코드로 변환해 a의 아스키코드만큼 빼주고 n을 더한 값을 26으로 나눠 a의 아스키코드만큼 더해준 후 리스트를 문자열로 변환해 리턴한다.

여기서 %26+ord()를 해주는 이유는 알파벳 순환을 구현하기 위해서다.


정리

ord()

: 문자 ➡️ 아스키 코드 변환

 

chr()

: 아스키 코드 ➡️ 문자 변환