본문 바로가기

TIL

[240321] 파이썬: 코드카타 45 & SQL: 코드카타 158~160

[파이썬 코드카타]

시저 암호

https://school.programmers.co.kr/learn/courses/30/lessons/12926

 

1) 어떤 문제가 있었나

- 어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 함

- 문자열이 있고 특정 숫자만큼 거리를 밀어서 완성되는 문자열을 반환  

 

2) 내가 시도해본 건 무엇인가

- 문자열을 숫자로, 숫자를 문자열로 바꿀 수 있는 함수를 찾아봄 

- ord('문자'): 아스키 코드(숫자)를 반환

- chr('숫자'): 아스키 코드에 해당하는 문자열을 반환

 

3) 어떻게 해결했나

- a~z, A~Z 구간을 ord 함수로 숫치화 하여 if 절로 조건 추가 

- 알파벳 구간을 순회할 수 있도록 마지막에 26 빼기 처리

def solution(s, n):
    answer = ""
    for i in range(len(s)):
        cypher = ord(s[i]) + n
        if 65 <= ord(s[i]) <= 90: # 소문자면 
            if cypher > 90:
                answer += chr(cypher - 26)
            else:
                answer += chr(cypher)
        elif 97 <= ord(s[i]) <= 122: #대문자면 
            if cypher > 122:
                answer += chr(cypher - 26)
            else:
                answer += chr(cypher)
        else:
            answer += chr(32)
    return answer

 

 

4) 무엇을 새롭게 알았나

- ord(문자열)에 n을 더한 최종 값에 -26을 하지 않고, %26으로 나머지를 구한 뒤 첫 문자열(A, a) 숫자에 더하여 +n 문자열 추출 

- 반복문을 통해 s[0], s[1] , s[2] ... 문자열 순서대로 뽑아 두고, join(s)로 마지막에 취합하면 완성! 

# 다른 사람 풀이01
def caesar(s, n):
    s = list(s)
    for i in range(len(s)):
        if s[i].isupper():
            s[i]=chr((ord(s[i])-ord('A')+ n)%26+ord('A'))
        elif s[i].islower():
            s[i]=chr((ord(s[i])-ord('a')+ n)%26+ord('a'))

    return "".join(s)


- 문자열을 ord, chr 함수 처리하지 않아도, 부등호 적용이 가능

# 다른 사람 풀이02
def solution(s, n):
    answer = ''
    for i in s:
        if i:
            if i >= 'A' and i <= 'Z':
                answer += chr((ord(i) - ord('A') + n) % 26 + ord('A'))
            elif i >= 'a' and i <= 'z':
                answer += chr((ord(i) - ord('a') + n) % 26 + ord('a'))
            else : 
            	answer += ' '
    return answer