관리 메뉴

오늘도 배운다

시저 암호 / 프로그래머스, 파이썬 코딩테스트 연습 연습문제 본문

코딩테스트연습(파이썬)

시저 암호 / 프로그래머스, 파이썬 코딩테스트 연습 연습문제

LearnerToRunner 2022. 12. 6. 02:23

문제

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

 

 

제출답안

def solution(s, n):
    # A-Z: 65-90, a-z: 97-122. A-Z 25개
    answer = ''
    for letter in s:
        ascii = ord(letter) # 글자의 아스키코드
        new_ascii = ascii+n # 아스키코드에 n 더하기
        
        # n을 더했을 때  Z(z)의 코드를 넘을 경우, A(a) 코드 + new_ascii % (Z(z)코드 +1)
        if letter.isupper(): # 대문자의 경우: A - 65, Z - 90
            
            answer = answer+chr(65+new_ascii%91) if new_ascii> 90 else answer+chr(new_ascii)
        elif letter.islower(): # 소문자의 경우: a - 97, z - 122
            answer = answer+chr(97+new_ascii%123) if new_ascii> 122 else answer+chr(new_ascii)            
        else: # 공백인 경우
            answer += ' '
    return answer

 

 

제출 후 개선답안

숫자를 더하더라도 특정 범위 내에서 순환시키려면
범위의 첫번째 값 + (기존값 + - 범위 내 첫번째 값 + n) % 범위내 개수

코드의 가독성이 좋아짐.
성능면에서는 차이가 없는듯하며
테스트 13에서는 오히려 떨어짐.
>> 호출하는 함수가 많아서 그런가?

def solution(s, n):
    answer = ''
    for letter in s:
        if letter.isupper():
            answer += chr(ord('A') + (ord(letter)-ord("A")+n)%26)
        elif letter.islower():
            answer += chr(ord('a') + (ord(letter)-ord("a")+n)%26)
        else:
            answer += ' '
    return answer

 

개선 전/후

문제 바로가기

 

728x90
Comments