TIL
[240321] 파이썬: 코드카타 45 & SQL: 코드카타 158~160
동명이인B
2024. 3. 21. 18:05
[파이썬 코드카타]
시저 암호
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