나의 풀이
def solution(s, n):
answer = ''
for i in s :
if i == ' ' : answer += ' '
else :
if ord(i) + n > ord('z') :
answer += chr(ord('a') + (n-1-(ord('z')-ord(i))))
elif ord(i)>= ord('a') :
answer += chr(ord(i) + n)
elif ord(i) + n > ord('Z'):
answer += chr(ord('A') + (n-1-(ord('Z')-ord(i))))
else :
answer += chr(ord(i) + n)
return answer
각 문자에 대해 조건을 나누어 처리하였다.
공백일 경우 그대로 공백을 추가한다.
만약 소문자일 때 n을 더한 값이 'z' 를 초과한다면?
-> n 에서 (해당문자에서 'z' 까지의 차이)를 뺀 만큼 'a' 에서 더하고 1을 빼준다.
만약 소문자일 때 n을 더한 값이 'z' 를 초과하지 않는다면?
-> 그냥 더한다.
만약 대문자일 때 n을 더한 값이 'Z' 를 초과한다면?
-> n 에서 (해당문자에서 'Z' 까지의 차이)를 뺀 만큼 'A' 에서 더하고 1을 빼준다.
만약 대문자일 때 n을 더한 값이 'Z' 를 초과하지 않는다면?
-> 그냥 더한다.
- chr(숫자) : 숫자(아스키코드)에 맞는 문자를 변환해준다.
- ord(문자) : 문자에 맞는 아스키코드(숫자)로 변환해준다.
보완해야 할 점 : 나머지 연산(%) 을 활용하자...!
다른 풀이
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)
isupper(), islower() 과 같은 파이썬 함수를 이용할 뿐 아니라,
알파벳 개수만큼인 26으로 나머지 연산을 하여 불필요한 조건문을 제거한 깔끔한 코드이다.
만약 s[i] 가 X, n이 5라고 가정하자.
X의 아스키코드 - A의 아스키코드 + n -> 23 + 5 = 28 -> Z를 넘어가는 숫자이다.
따라서 28%26을 하였을 때 나머지가 2이고, 이를 A에 더하면 C가 될 것이다.
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)
또 다른 풀이이다.
chr(), ord() 를 사용하지 않고, 알파벳 소문자 대문자 문자열을 미리 정의해 놓은 방법이다.
find() 함수를 이용해서 해당 문자의 인덱스를 찾고, 거기에 n을 더하고 26으로 나머지연산을 한다.
그 결과값에 해당하는 인덱스의 문자를 answer 에 추가한다.
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
혹은 이렇게 문자에 부등호를 주는 방법도 있다.
'알고리즘 > 이것저것' 카테고리의 다른 글
[프로그래머스] 수박수박수박수박수박수? - 파이썬(python) (0) | 2022.09.03 |
---|---|
[프로그래머스] 문자열을 정수로 바꾸기 - 파이썬(python) (0) | 2022.09.03 |
[프로그래머스] 약수의 합 - 파이썬(python) (0) | 2022.09.03 |
[프로그래머스] 이상한 문자 만들기 - 파이썬(python) (0) | 2022.09.02 |
[프로그래머스] 자릿수 더하기 - 파이썬(python) (0) | 2022.09.02 |
댓글