본문 바로가기

그 땐 Algorithm했지/그 땐 Programmers했지

[TAVE/level 1] 시저 암호

728x90

문제

 

내 풀이
capital = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
lower = 'abcdefghijklmnopqrstuvwxyz'

def solution(s, n):
    answer = ''

    for i in range(len(s)):
        if s[i] in capital:
            after_idx = capital.index(s[i]) + n
            if after_idx > 25:
                after_idx = after_idx - 26
            answer += capital[after_idx]
        elif s[i] in lower:
            after_idx = lower.index(s[i]) + n
            if after_idx > 25:
                after_idx = after_idx - 26
            answer += lower[after_idx]
        else: #공백
            answer += " "

    return answer

📌 먼저 대문자와 소문자 모음 문자열을 만들었다.

📌 그리고 s를 for문으로 돌리면서 각 문자열에 있는지 검사했다.

📌 해당 글자가 있다면 해당 글자의 인덱스에 n을 더하고 난 후의 인덱스로 글자를 찾아 반환했다. 

 

다른 사람 풀이
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)

✍🏻 isupper(), islower:() 해당 글자가 대문자인지 소문자인지 판단해 boolean으로 값을 반환해주는 메서드이다.

👉🏻 이 메서드를 사용하면 나처럼 굳이 대문자, 소문자 알파벳 문자열을 안 만들어 된다!

 

✍🏻 chr(), ord(): 아스키 코드를 문자열로, 문자열을 아스키 코드로 변환해준다.

👉🏻 이 메서드를 사용하면 나처럼 해당 글자 인덱스가 25를 넘었을 경우의 예외처리를 안 해줘도 된다!

 

✍🏻 "".join(list): list를 넣어주면 해당 리스트의 값들 사이에 구분자를 넣어 하나의 문자열로 합쳐준다.

👉🏻 리스트를 문자열로 편하게 바꿔준다!

728x90