[프로그래머스_Lv1] 시저 암호

Lee, Chankyu·2021년 9월 9일
0
post-thumbnail

시저 암호

문제 링크

나의 풀이

def solution(s, n):
    answer = ''
    capital = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    small = 'abcdefghijklmnopqrstuvwxyz'
    for i in s:
        if i in capital:
            caesar = capital.find(i) + n
            answer += capital[caesar%26]
        elif i in small:
            caesar = small.find(i) + n
            answer += small[caesar%26]
        else:
            answer += " "      
    return answer
  • 모범 답안으로 아스키 코드를 활용한 답안들이 있지만 나는 아스키 코드를 활용하지 않고 전체 알파벳이 포함된 변수 두 개(대문자, 소문자)를 선언하여 풀이 하였다. .find() 함수를 이용하여 input된 문자열 s을 구성하는 각각의 알파벳들이 변수 capital 혹은 small 에서 몇번 index에 위치하는지 알아낸 후, 알아낸 index에 n을 더한 값을 26(알파벳 전체 수)으로 나눈 값을 구한다. 그리고 그 값을 전체 알파벳을 나열한 변수(capital or small)의 index값으로 활용하여 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[i] 가 대문자/소문자 (isupper, islower)일 경우로 나누어 진행한다. s[i] 에서 n만큼 밀었을때 어떤 알파벳이 되는지에 대한 계산식의 원리는 나의 답안과 동일하다고 볼 수 있다. 다만 아스키코드이기 때문에 첫번째 알파벳 A의 아스키코드 정수값을 빼주거나 더해주며 원하는 값을 구해야 한다. 마지막에는 리스트 타입의 문자들을 join 함수를 사용하여 하나의 문자열로 변환해 주었다.
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
  • 문자열도 부등호가 사용 가능하다는 것을 활용한 답안이다. 전체적인 구조는 위의 답안과 동일하다.

✅ Python ASCII
- ord(문자) : 문자에 해당하는 ASCII 정수값 반환
- chr(정수) : 정수에 해당하는 ASCII 문자 반환
- string.ascii_lowercase : 소문자에 해당하는 ASCII 값
- string.ascii_uppercase : 대문자에 해당하는 ASCII 값

profile
Backend Developer - "Growth itself contains the germ of happiness"

0개의 댓글