[파이썬 코드카타]
시저 암호
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
'TIL' 카테고리의 다른 글
[240325] 파이썬: 코드카타 46 & SQL: 코드카타 161~164 (0) | 2024.03.25 |
---|---|
[240322] 파이썬 실습 코드: 메모리 경량화 (with parquet) (0) | 2024.03.22 |
[240321] 클러스터링 분석 - ② 차원 축소: 주성분 분석(PCA)과 t-SNE (0) | 2024.03.21 |
[240320] 파이썬으로 하는 클러스터링 분석 - ① 기본 개념과 거리 계산 (0) | 2024.03.20 |
[240319] 스파크(spark): 배경 및 기본 구조, 기능 (1) | 2024.03.19 |