https://school.programmers.co.kr/learn/courses/30/lessons/12926
✳️ 코드 작성
🤔 코드 아이디어
1. 빈 문자열 변수를 지정한다.
2. for문으로 문자열 s를 순회한다.
3. 문자열 s가 공백일 때, 아닐 때를 조건문으로 구분한다.
4. 공백이 아닐 때, 문자열 s의 시저 암호를 찾기( + n )를 시도한다.
> 이 때, 아스키 코드를 활용해준다.
5. 대문자가 아니거나, 특수기호로 변환이 될 경우를 조건문으로 구분한다.
> 소문자는 소문자로 변환되어야 하고 대문자는 대문자로 시저 암호 법칙을 적용해야 하기 때문
> 아스키코드에 따르게 되면 대문자였던 문자가 소문자나 특수기호로 변환이 되기 때문에 이러한 조건이 필요
> 알파벳 개수만큼 빼준다.
💟 코드 풀이
def solution(s, n):
answer = ''
for i in s:
if i == " ":
answer += " "
else:
k = chr(ord(i) + n)
if k.isupper() != i.isupper() or not k.isalpha():
k = chr(ord(k) - 26)
answer += k
return answer
🟣 변수 초기화
- answer는 결과를 저장할 빈 문자열
🟣 for문을 통한 문자 순회
- for i in s:는 문자열 s의 각 문자를 하나씩 순회
🟣 공백 처리
- if i == " ":에서 공백 문자는 암호화하지 않고 그대로 추가
- answer += " "는 공백을 결과 문자열에 추가
🟣 문자 암호화
- 공백이 아닌 문자는 k = chr(ord(i) + n)에서 아스키 값을 n만큼 더한 후, chr 함수로 다시 문자로 변환
- ord(i)는 문자를 아스키 코드로 변환하고, chr()는 다시 문자로 변환하는 함수
🟣 알파벳 범위 조정
- 만약 변환된 문자가 원래와 다른 대소문자라면(k.isupper() != i.isupper()), 또는 알파벳이 아니라면(not k.isalpha())
- 알파벳 범위를 넘어갔다고 판단하고 26을 빼서 다시 순환
🟣 결과 저장
- 변환된 문자를 answer에 계속 추가
🟣 최종 반환
- 모든 문자를 변환한 후, 완성된 암호화된 문자열을 반환
💠 예시
🔵 입력 예시
s = 'Az'
n = 3
🔵 빈 문자열 초기화 후 순회 for i in s:
1️⃣ 첫 번째 문자 : 'A'
- i = 'A'
- if i == " ":
- 문자가 공백인지 확인합니다. 'A'는 공백이 아니므로 이 조건은 건너뜀
- k = chr(ord(i) + n)
- ord('A')는 'A'의 아스키 값을 반환하는 함수, 'A'의 아스키 값은 65
- 여기에 n = 3을 더하면 68
- chr(68)은 아스키 값 68에 해당하는 문자 'D'
- k = 'D'
- if k.isupper() != i.isupper() or not k.isalpha():
- k.isupper()는 'D'가 대문자인지 확인, 'A'도 대문자이므로, 둘 다 대문자로 대소문자가 일치
- 그리고 'D'는 알파벳이므로 이 조건을 통과하여 추가적인 조정은 필요 없음
- answer += k
- 결과 문자열 answer에 'D'를 추가
- answer = 'D'
2️⃣ 다음 문자 : 'z'
- i = 'z'
- if i == " ":
- 'z'는 공백이 아니므로 조건을 건너뜀
- k = chr(ord(i) + n)
- ord('z')는 122, 여기에 n = 3을 더하면 125
- chr(125)는 알파벳이 아니고 '}'라는 특수 문자
- k = '}'
- if k.isupper() != i.isupper() or not k.isalpha():
- 변환된 k는 알파벳이 아니므로 not k.isalpha() 조건이 참
- k = chr(ord('}') - 26)
- ord('}') = 125이고, 여기에서 26을 빼면 99
- chr(99)는 'c'
- k = 'c'
- answer += k
- 변환된 문자 'c'를 결과 문자열에 추가
- answer = 'Dc'
🔵 최종 반환 return answer
- 모든 문자가 변환된 후 결과 문자열 'Dc'를 반환
solution('Az', 3)
# 결과: 'Dc'
'📒 Today I Learn > 🐍 Python' 카테고리의 다른 글
[Python] 문자열 내 마음대로 정렬하기 (0) | 2024.09.13 |
---|---|
[Python] 숫자 문자열과 영단어 (딕셔너리 이용) (0) | 2024.09.12 |
[Python] 최소 직사각형 (0) | 2024.09.10 |
[Python] 크기가 작은 부분 문자열 (0) | 2024.09.09 |
[Python] 삼총사 문제로 삼중 for문 (0) | 2024.09.06 |