본문 바로가기

Computer Science/Algorithms

[python] 프로그래머스 - 시저 암호 (두 가지 풀이방법)


나의 풀이 : 문자열 인덱싱 사용

def solution(s, n):
    low = "abcdefghijklmnopqrstuvwxyz" # 소문자. 인덱스는 0에서 25
    up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    answer = ''
    for char in s:
        if char in low:
            ind = low.find(char)+n # low 문자열에서 찾은 해당 알파벳 인덱스 + n
            answer += low[ind%26] # 26으로 나눈 나머지를 사용할 경우 25를 초과하는 경우도 활용 가능
        elif char in up:
            ind = up.find(char)+n
            answer += up[ind%26]
        else: # 공백일 경우도 고려
            answer += " "
    return answer
    
solution("a B z E", 4) # 'e F d I'

 

 

나는 아스키 코드를 사용하지 않고 소문자, 대문자를 각각 담은 문자열을 만들어 인덱싱 해 사용하였다.

 

알파벳은 26개, 인덱스는 0 ~ 25까지인데, n을 더하였을 때 25를 넘어갈 경우가 있기에

26으로 나눈 나머지를 사용하였다.

 

따라서

(1) 26보다 작을 경우 26으로 나눈 나머지는 그 숫자 자체이고 (예) 5%26 -> 5)
(2) 26 이상일 경우 26으로 나눈 나머지를 활용하면 다시 문자열 처음으로 돌아가 활용 가능하다.

(예) 26%26 -> 0, a / A를 의미)

 

만일 s에 공백이 주어질 경우를 대비해 else문도 넣어주었다.

 


모범 답안 : 아스키 코드 사용 (chr() 와 ord())

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(caesar("a B z", 4)) # 'e F d'

 

 

이 풀이를 보며 처음 알게 된 파이썬 함수들이다.
chr() 함수는 숫자를 인자로 주면 아스키 코드에 해당하는 문자를 반환하며 (아스키 코드 -> 문자)
ord() 함수는 문자의 아스키 코드를 반환한다. (문자 -> 아스키 코드)

 

아스키 코드를 활용할 경우, 나의 풀이에서와 같이 공백을 고려하지 않아도 되어 편리한 것 같다.

 

 

image

 

image