ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] 시저 암호
    programing/Algorithm 2021. 1. 10. 22:07

    시저 암호

    연습 문제

    level 1

     

    python3

    def solution(s, n):
        largeAsciiRange = (65, 90)
        smallAsciiRange = (97, 122)
        asciiList = []
        
        for c in s:
            if c == ' ':
                asciiList.append(c)
                continue
            
            asciiNum = ord(c)
            shiftedAsciiNum = asciiNum + n
            
            if c.isupper() and shiftedAsciiNum > largeAsciiRange[1]:
                gap = shiftedAsciiNum - largeAsciiRange[1]
                shiftedAsciiNum = largeAsciiRange[0] + gap - 1
            elif c.islower() and shiftedAsciiNum > smallAsciiRange[1]:
                gap = shiftedAsciiNum - smallAsciiRange[1]
                shiftedAsciiNum = smallAsciiRange[0] + gap - 1
            
            asciiList.append(chr(shiftedAsciiNum))
            
        return "".join(asciiList)

    c를 시프트해서 만약 알파벳 영역을 벗어난다면, 보정을 해주는 작업을 거친다.

    굳이 range 튜플을 쓰지 않고 ord() 함수를 써도 충분했을 듯 하다.

    만약 파이썬 내장 자료구조에 circular queue가 있다면 그냥 그거 쓰는게 더 우아할 듯.

     

    def solution(s, n):
        characterList = []
        alphabetNum = 26
        
        for c in s:
            if c == ' ':
                characterList.append(c)
                continue
            
            asciiNum = ord(c)
            shiftedAsciiNum = None
            
            baseAsciiNum = ord('A') if c.isupper() else ord('a')
            shiftedAsciiNum = (asciiNum - baseAsciiNum + n) % alphabetNum + baseAsciiNum
            
            characterList.append(chr(shiftedAsciiNum))
            
        return "".join(characterList)

    로직을 좀 더 우아하게 바꿔서, c의 아스키 넘버를 인덱스화 시킨다. (asciiNum - baseAsciiNum)

    그리고 이 인덱스에 n을 더해서 밀어준다.

    만약 밀려진 인덱스가 알파벳 개수인 26을 넘으면 안되므로, %로 보정해준다.

    이러한 과정을 거치면, 알파벳 아스키 넘버 영역을 넘어섰는지 확인 할 필요가 없으므로, 조건문 하나를 제거할 수 있다.

    이제 baseAsciiNum으로 부터 얼마나 떨어졌는지 구해졌으므로, 다시 baseAsciiNum을 더해서 밀린 캐릭터의 아스키 넘버를 구한다.

    이 아스키 넘버로 캐릭터를 만들어 배열에 넣어준다.

    이것들을 조인해주면 끗.

     

    파이썬의 ternary operator는 왜 저따구인지 이해할 수 없다. 자연어랑 유사하게 갈거면 if condition then true_value else false_value 이렇게 하던지.. 

    댓글

Designed by black7375.