https://programmers.co.kr/learn/courses/30/lessons/12926
프로그래머스 레벨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가지 방법을 알게 되었다. 무작정 하드코딩하는 것 보다 이런 방법을 알고 있으면 훨씬 쉽고 간단하게 코드를 짤 수 있는 것 같다.. 아직 많이 모르고 있다는 걸 이번 문제를 풀면서 또 느꼈다!