Q. 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.제한 조건

  • 공백은 아무리 밀어도 공백입니다.
  • s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
  • s의 길이는 8000이하입니다.
  • n은 1 이상, 25이하인 자연수입니다.

입출력 예

"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

 

def solution(s, n):
    answer = []
    for alp in s:
        if alp.isalpha():    #alp가 알파벳일 때
            if 65 <= ord(alp) <= 90:  # alp의 ASKII코드가 65~90사이일때,(대문자일때)
                if ord(alp)+n >90:    # n을 더한 값이 Z = 90 보다 크면
                    answer.append(chr(ord(alp)+n-26))  #한바퀴 돌아와야하기 때문에 알파벳의 갯수 26을 뺌
                else:
                    answer.append(chr(ord(alp)+n))
            else:                     # alp의 ASKII코드가 92~122사이일때,(소문자일때)
                if ord(alp)+n > 122:  
                    answer.append(chr(ord(alp)+n-26))
                else:
                    answer.append(chr(ord(alp)+n))
        else:
            answer.append(' ')        #공백은 ' '로 처리
            
    return ''.join(answer)

 

도무지 혼자 풀 수 없어서 다른 사람들의 풀이를 참고하여 새로운 함수 몇가지를 배우고 써봤다.

isalpha() : 알파벳인지 아닌지 구분 (T/F로 출력)

ord() : 알파벳을 ASKII코드로 변환  (대문자는 A~Z가 65~90, 소문자는 a~z가 97~122)

chr() : ASKII코드를 알파벳으로 변환

 

 

내가 알던 시저암호는 C = E(k , p) = (p + k)mod26  , 즉 알파벳의 갯수 26으로 나눈 나머지로 계산하는 거였는데 아스키코드로 바꿔서 연산하려니 나머지보다 빼기가 더 만만해보였다.

내일 다시 일어나서 %로 연산을 해보기로!

'Algorithm' 카테고리의 다른 글

programmers #다리를 지나는 트럭  (0) 2021.08.08
programmers #기능개발  (0) 2021.08.08
programmers #체육복(정답아님)  (0) 2021.08.07
programmers #예산  (0) 2021.08.07
programmers #2016년  (0) 2021.08.06

+ Recent posts