프로그래머스 LV1 시저 암호(연습문제)

프로그래머스 LV1 시저 암호(연습문제)

2021, Apr 05    

프로그래머스 lv1 시저 암호(연습문제)

문제 설명

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

예를 들어 “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”| —

접근

아스키코드

chr():아스키 코드 숫자를 입력하면 문자로 돌려줌
ord(): 아스키 코드 문자를 입력하면 숫자로 돌려줌
문자.isupper(): 전달한 아스키 값에 해당하는 문자가 대문자인지 확인
문자.islower(): 전달한 아스키 값에 해당하는 문자가 소문자인지 확인

아스키 코드를 이용해서 풀면되는데, n 만큼 밀리므로 알파벳 뒷 부분은 그냥 n을 더해주면 알파벳 아스키코드를 넘어가게된다. 그 부분만 유의해주면 됨


풀이

# 아스키 코드를 활용한 모범 답안

def caesar(s, n):
    s = list(s)
    print(s)
    for i in range(len(s)):
        if s[i].isupper(): #isupper() 전달한 아스키 값에 해당하는 문자가 대문자인지 확인
            s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
        elif s[i].islower():#ilower() 전달한 아스키 값에 해당하는 문자가 소문자인지 확인
            s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))
 
    return "".join(s)
 
print(caesar("a B z", 4)) # 'e F d'

else가 아닌 elif를 쓴 이유는 공백 ' '을 그냥 넘기기 위함이다. 그리고 굳이 ord('A')를 빼주고 더한 뒤 %26으로 나머지에서 다시 더해준 이유는 이 작업을 하지 않으면 n을 더했을때 z를 넘어가버리는 숫자가 나오는 경우에 알파벳으로 리턴되지 않기 때문이다.(알파벳의 총 개수는 대문자 26, 소문자 26개).


출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges