코딩테스트 공부/프로그래머스 문제

[Python] 시저암호

연디연디 2022. 1. 8. 19:51
728x90

아스키 코드를 잘 알아야 풀 수 있는 문제!! 나중에 다시 한 번 더 공부해야할 것 같다ㅜㅜ

 

✨풀이과정

1
2
3
4
5
6
7
8
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')) 
    return "".join(s)
cs
  • 각 문자열을 하나씩 쪼개서 아스키코드로 변환해야하기 때문에 list(s)로 치환해서 담았다. 
  • 만약 s[i]번째 문자가 대문자/소문자라면(isupper/islower) s[i]의 값은 (s[i]의 ASCII값 - 'A'/'a'의 ASCII값(97/65))+n을 해주어 몇 번째에 있는 알파벳인지 찾아준다. (알파벳은 총 25글자)
  • ord(s[i])-ord('A') (또는 ord('a')) 26으로 나눈 나머지 값에 'A'/'a' ASCII 값 = 97/65을 더해주면 n만큼 민 값이 나오게 된다. 
  • %26을 해주는 이유 ? z 또는 Z의 범위를 넘어가지 않도록 하기 위해
  • 즉, 맨 처음 값인 ord('A')와 ord('a')에서 n만큼 증가한 값이 무엇인지 찾는 것이다. 
  • 공백은 밀어도 공백이기 때문에 무시한다.
  • ""을 기준으로 join하여 return

출처: https://wooaoe.tistory.com/72 [개발개발 울었다]

 

 

✔ 체크포인트

✔Python ASCII

  • ord(문자) : 문자에 해당하는 ASCII 정수값 반환 
  • chr(정수) : 정수에 해당하는 ASCII 문자 반환
  • string.ascii_lowercase : 소문자에 해당하는 ASCII 값 
  • string.ascii_uppercase : 대문자에 해당하는 ASCII 값

 

✔ASCII chart

 

 

 

 

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

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

programmers.co.kr

 

728x90