프로그래머스 연습문제
- Lv 1. 시저 암호 (Python)
https://school.programmers.co.kr/learn/courses/30/lessons/12926
def solution(s, n):
answer = ''
for i in s:
# 소문자인 경우
if(i.islower()):
current_ord = ord(i) + n # 현재 문자에 n만큼 이동한 아스키코드 값
if(current_ord > ord('z')): # 만약 최대 알파벳인 z를 넘어가는 값이라면, 다시 a부터 순환하도록 해야하므로 값을 바꿔줘야 한다.
answer += chr(ord('a') + (current_ord - ord('z') - 1)) # z를 넘어서 이동한 만큼의 값을 다시 a부터 이동하면 된다.
else:
answer += chr(current_ord)
# 대문자인 경우
if (i.isupper()):
current_ord = ord(i) + n
if (current_ord > ord('Z')):
answer += chr(ord('A') + (current_ord - ord('Z') - 1))
else:
answer += chr(current_ord)
# 공백인 경우
if(i == ' '):
answer += ' '
return answer
n
만큼 더해주고, 이를 이용해 다시 문자로 변환하면 편할 것 같다는 생각에 ord()
, chr()
을 검색하여 사용하였다.n
만큼 더해준다.n
만큼 더해준 값이 소문자, 대문자의 끝인 z
나 Z
보다 큰 아스키코드 값을 가진다면, z
보다 얼만큼 더 멀리 이동했는지 뺄셈으로 구하여 a의 아스키코드 값에서 다시 더해줘야 한다.C
이고, n
이 25라면C 아스키코드
= 67Z의 아스키코드
= 90A
로 계산되어야 한다. 즉, 65 + (92 - 90 - 1) 을 하면 Z
를 넘어서 다시 A
부터 시작할 때 무슨 문자인지 나온다.A의 아스키코드 + (초과된 아스키코드 값 - Z의 아스키코드 - 1)
)▶️ 리스트를 이용한 코드
def caesar(s, n):
lower_list = "abcdefghijklmnopqrstuvwxyz"
upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
result = []
for i in s:
if i is " ":
result.append(" ")
elif i.islower() is True:
new_ = lower_list.find(i) + n
result.append(lower_list[new_ % 26])
else:
new_ = upper_list.find(i) + n
result.append(upper_list[new_ % 26])
return "".join(result)
▶️ 문자열도 부등호로 비교 가능
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
▶️ ord()
, chr()
참고 : https://lsjsj92.tistory.com/201
>>> # 소문자
s = 'a'
print(ord(s)) # 97
s = 'z'
print(ord(s)) # 122
print(chr(97)) # 'a'
>>> # 대문자
s = 'A'
print(ord(s)) # 65
s = 'Z'
print(ord(s)) # 90
print(chr(90)) # 'Z'
>>> # 소문자의 아스키코드 범위 : 97 ~ 122
>>> # 대문자의 아스키코드 범위 : 65 ~ 90