[알고리즘] 시저 암호

sith-call.dev·2023년 4월 20일
0

알고리즘

목록 보기
8/47
def solution(s, n):
    lst = []
    for element in s:
        if element == " ":
            lst.append(" ")
        elif ord(element) >= 65 and ord(element) <= 90:
            idx = ((ord(element) - 65 + (n % 26)) % 26) + 65
            lst.append(chr(idx))
            # lst.append(str([ord(element), idx]))
        elif ord(element) >= 97 and ord(element) <= 122:
            idx = ((ord(element) - 97 + (n % 26)) % 26) + 97
            lst.append(chr(idx))
            # lst.append(str([ord(element), idx]))
        else:
            continue
    answer = "".join(lst)
    return answer

소감

결국은 f:N->N,x->y인 함수를 주어진 설명에 맞게 만드는 행위이다.
이때 나머지 정리를 잘 활용해야 하는데, 머리로만 생각한게 바로 들어맞지 않는다. 따라서 직접 하나씩 연산마다 어떻게 맵핑을 시켜 가야 하는지 적는 편이 낫다.
그리고 작은 스케일에서 함수를 짜본 다음에 큰 스케일로 넘어가는게 좋다. 이때 작은 스케일에서 엣지 케이스까지 처리해봐야 한다.

고칠 점

  1. islower(), isupper() 사용해서 아스키 코드 하드 코딩 하지 않기
  2. 첫문자 + 인덱스값 의 구조로 더 간단하게 코드 바꾸기
  3. 인덱스 값 = ((문자의 아스키 코드 - 첫 문자의 아스키코드) + n ) % 문자의 총 개수

흐름

X = {a, b, c, d}
Y = {5, 6, 7, 8}
ord(a) = 5, ord(b) = 6, f(c) = 7, f(d) = 8

위와 같이 문자와 아스키 코드가 주어진 경우처럼 스케일 작게 해서 한번 흐름을 설명해본다.

  1. 주어진 문자의 아스키 코드에서의 인덱스값을 계산한다.
    ord(X) - 5 = {0, 1, 2, 3}

  2. 앞으로 가야할 n을 4 안에서 순환하도록 값을 변경한다.
    n % 4 = {0, 1, 2, 3}
    n이 0 ~ 5을 넣어보면 모든 경우를 테스트 해볼 수 있다.

  3. 주어진 범위 안에서 순환하도록 변경한 n의 값을 인덱스 값에 넣어준다.
    (ord(X) - 5) + (n % 4)

  4. 변경된 인덱스 값이 다시 4 안에서 순환하도록 값을 변경해준다.
    (ord(X) - 5) + (n % 4) % 4

  5. 인덱스 값을 아스키 코드 값으로 다시 변환해준다.
    ((ord(X) - 5) + (n % 4) % 4) + 5

profile
lim (time → ∞) Life(time) = LOVE

0개의 댓글

관련 채용 정보