소소한 컴퓨터 이야기

시저 암호

by Cori

문제

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다.

예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와

거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

 

제한조건 

· 공백은 아무리 밀어도 공백입니다.

· s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.

· s의 길이는 8000이하입니다.

· n은 1이상, 25이하인 자연수입니다.

 

입출력 예 

s n result
'AB' 1 'BC'
'z' 1 'a'
'a B z' 4 'e F d' 

풀이

1. Me

def solution(s, n):
    answer = []
    alpha_l = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'\
              ,'p','q','r','s','t','u','v','w','x','y','z']
    alpha_u = [x.upper() for x in alpha_l]
    for i in range(len(s)):
        if s[i] == ' ':
            answer.append(s[i])
            continue
        if s[i] in alpha_l:
            # print(type(alpha_l.index(s[i])))
            # print(alpha_l[(alpha_l.index(s[i]) + n) % 26])
            answer.append(alpha_l[(alpha_l.index(s[i]) + n) % 26])
            
        elif s[i] in alpha_u:
            # print(alpha_u[(alpha_u.index(s[i]) + n) % 26])
            answer.append(alpha_u[(alpha_u.index(s[i]) + n) % 26])
    return "".join(answer)

ASCII 코드 연산하는 방법이 있었던걸로 알고 있는데, 기억이 나지 않아 노가다성으로 코드를 작성했다. 알파벳 소문자와 대문자를 담은 리스트를 만들고, 입력받은 문자열과 비교하며 인덱스에를 미는 방식으로 풀었다.

 

* z or Z에 1을 더하면 a or A가 되기 때문에, 이를 구현하기 위해 밀고 난 후 26(알파벳 개수)으로 나누어 주었다.  

 

2. Others

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() 연산자를 이용하여 문자가 소문자인지 대문자인지 검사후, 각각에 대해 ord 연산 적용  

* ord 연산 시 ord('a') - ord('a')와 같이 끝에 ord('a')를 빼고, chr 연산 적용할 때 끝에 + ord('a') 해주는 것 잊지 말자 ! 


자료 정리

1. chr() 함수 vs ord() 함수 

1) chr() 함수

-> 문자의 유니코드 값을 입력받아, 그 코드에 해당하는 문자를 출력하는 함수 

 

2) ord() 함수

-> 문자의 돌려주는 함수로, chr 함수와 반대이다.

print(chr(97))  # -> 'a' 
print(chr(44032))    # -> '가'

print(ord('a'))  # -> 97
print(ord('가'))   # -> '가'

'CS > Coding Test' 카테고리의 다른 글

서울에서 김서방 찾기  (0) 2021.08.21
수박수박수박수박수 ?  (0) 2021.08.21
약수의 합  (0) 2021.08.21
자릿수 더하기  (0) 2021.08.21
자연수 뒤집어 배열로 만들기  (0) 2021.08.21

블로그의 정보

코딩하는 오리

Cori

활동하기