라떼는말이야

[프로그래머스 lv1] 시저 암호 (파이썬) 본문

알고리즘/코딩 테스트

[프로그래머스 lv1] 시저 암호 (파이썬)

MangBaam 2021. 6. 25. 23:24
반응형

문제 설명

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

제한 조건

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

입출력 예

입출력 예

 


나의 풀이

def solution(s, n):
    answer = ''
    
    for c in s:
        if c == ' ': 
        	# 공백문자 처리
            answer += ' '
            continue
        scissor = ord(c) + n
        if (ord(c) in range(ord('A'), ord('Z')+1) and scissor > ord('Z')) or \
            (ord(c) in range(ord('a'), ord('z')+1) and scissor > ord('z')):
            # c가 대문자면서 n을 더했을 때 'Z'를 넘어가는 경우
            # c가 소문자면서 n을 더했을 때 'z'를 넘어가는 경우
            answer += chr(scissor-26)
        else:
        	# 'Z'나 'z'를 넘어가지 않는 경우
            answer += chr(scissor)
        
    return answer

for문으로 문자열 s를 순회한다. 각 문자를 c라고 한다.

c가 공백이면 그대로 공백을 answer에 더해주고 이후 프로세스를 넘어간다.

 

ord("문자") 함수는 문자를 아스키코드 값으로 변환한다.

아스키 코드란 각 문자가 가지는 고정 값이다. 예를 들어 'A'는 65, 'a'는 97과 같은 값을 가진다.

ord()와 반대로 chr(정수) 함수는 숫자를 입력 받아 그 숫자(아스키코드)에 해당하는 문자를 반환해준다.

 

scissor에는 n만큼 이동한 후의 아스키코드 값을 저장한다.

 

이후 다음 두 가지 경우를 확인한다

  1. c가 대문자면서 n을 더했을 때 'Z'를 넘어가는 경우
  2. c가 소문자면서 n을 더했을 때 'z'를 넘어가는 경우

위 두가지 경우에서는 알파벳의 개수인 26을 빼서 그 값을 answer에 추가한다.

 

그 밖의 경우에는 그대로 scissor값을 answer에 추가한다.

 

 

테스트 결과

반응형
Comments