Algorithm

[프로그래머스] Level1 | 시저암호 - 파이썬(Python) | ASCII

토오오끼 2021. 11. 15. 14:31
728x90
반응형

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

 

코딩테스트 연습 - 시저 암호

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀

programmers.co.kr

프로그래머스 레벨1 시저암호 문제를 풀었다.

 


처음엔 하드코딩으로 A~Z, a~z 리스트를 만들어서 for문으로 문자를 바꾸려고 했는데 생각보다 잘 안됐다.

더 좋은 방법이 있을 것 같아서 구글링을 했고 아스키 코드로 바꾸는 방법을 알게 되었다.

참고한 사이트 : https://wooaoe.tistory.com/72

 

정답 코드

def solution(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'))
        else :
            continue
            
    return ''.join(s)

 

isupper()과 islower()로 문자열이 소문자인지 대문자인지 if문으로 구별하였다. 공백도 있기 때문에 else로 묶어버리면 안된다!

문자열의 아스키코드에서 A/a의 아스키 값을 뺀 후 n을 더해서 문자열이 몇번째 알파벳인지 파악해야한다. 이 값은 26으로 나눴다. 왜 26으로 나눠야하는지 몰랐는데 위에서 참고한 링크를 보니 Z/z의 범위를 넘어가지 않게 하기 위함이라고 한다. (진짜.. 어떻게 저런 생각까지 하는걸까..?)

26을 나눈 값에 다시 A/a의 아스키 값을 더해주면 n만큼 뒤로 밀린 값이 나오게 된다.

공백일 땐 for문이 진행되도록 continue를 해줬다.


ord(문자) : 해당 문자의 ASCII 정수값 반환 

chr(정수) : 해당 정수의 ASCII 문자 반환

string.ascii_lowercase : 소문자 ASCII 값 

string.ascii_uppercase : 대문자 ASCII 값

파이썬에서 아스키코드로 변환하는 방법을 찾아보다가 이 4가지 방법을 알게 되었다. 무작정 하드코딩하는 것 보다 이런 방법을 알고 있으면 훨씬 쉽고 간단하게 코드를 짤 수 있는 것 같다.. 아직 많이 모르고 있다는 걸 이번 문제를 풀면서 또 느꼈다!

출처 : https://wooaoe.tistory.com/72 

 


해당 문제 풀이 코드

 

GitHub - YOOHYOJEONG/algorithm_practice: 알고리즘 공부 및 코딩테스트 준비

알고리즘 공부 및 코딩테스트 준비. Contribute to YOOHYOJEONG/algorithm_practice development by creating an account on GitHub.

github.com

 

728x90
반응형