본문 바로가기
Engineering WIKI/Programmers

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

by wonos 2022. 4. 19.
 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

내 풀이 (실패)

def solution(s, n):
    answer = ''    
    upper_list = list()
    lower_list = list()
    
    for i in range(ord('A'), ord('Z') + 1):
        upper_list.append(chr(i))
    for i in range(ord('a'), ord('z') + 1):
        lower_list.append(chr(i))

    for i in s:
        if i in upper_list:
            if i == 'Z':
                answer += upper_list[n - 1]
            else:
                next_index = upper_list.index(i) + n
                answer += upper_list[next_index]
        elif i in lower_list:
            if i == 'z':
                answer += lower_list[n - 1]
            else:
                next_index = lower_list.index(i) + n
                answer += lower_list[next_index]
        else:
            answer += " "
    
    return answer

 

내풀이 (성공)

def solution(s, n):
    answer = ''    
    upper_list = list()
    lower_list = list()
    
    for i in range(ord('A'), ord('Z') + 1):
        upper_list.append(chr(i))
    for i in range(ord('a'), ord('z') + 1):
        lower_list.append(chr(i))

    for i in s:
        if i in upper_list:            
            next_index = upper_list.index(i) + n
            answer += upper_list[next_index % 26]
        elif i in lower_list:
            next_index = lower_list.index(i) + n
            answer += lower_list[next_index % 26]
        else:
            answer += " "
    
    return answer

다른방법 1

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)
    # 주어진 문장을 암호화하여 반환하세요.


# 실행을 위한 테스트코드입니다.
print('s는 "a B z", n은 4인 경우: ' + caesar("a B z", 4))