-
[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 이렇게 하던지..
'programing > Algorithm' 카테고리의 다른 글
[Programmers] 이상한 문자 만들기 (0) 2021.02.11 [Programmers] 약수의 합 (0) 2021.01.13 [Programmers] 내적 (0) 2021.01.10 [Programmers] 문자열을 정수로 바꾸기 (0) 2021.01.10 [Programmers] 수박수박수박수박수박수? (0) 2021.01.10 댓글