유형 : 구현
풀이 시간 : 약 30분?
def solution(s, n):
tmp = list(ord(s[i]) for i in range(len(s)))
for i in range(len(tmp)):
if tmp[i] == 32:
continue
else:
if tmp[i] <= 90 and (tmp[i] + n) > 90:
tmp[i] += n
tmp[i] -= 26
elif tmp[i] <= 122 and (tmp[i] + n) > 122:
tmp[i] += n
tmp[i] -= 26
else:
tmp[i] += n
answer = [chr(tmp[i])for i in range(len(tmp))]
return ''.join(answer)
이렇게 오래 걸릴 문제가 아니었는데,, 쉽게 가려고 하지말고 그냥 처음 생각한 로직 그대로 밀고 나가자.
괜히 축약해서 코드를 썼다가 코너 케이스에서 다 걸렸다.
ord() : 문자 -> 숫자
chr() : 숫자 -> 문자
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)
# 주어진 문장을 암호화하여 반환하세요.
1. 그냥 isupper이랑 islower 써서 대소문자 구분했으면 더 편했을 텐데..
그리고 숫자보다는 ord('a') 이렇게 쓰는 게 더 좋았을 것 같다.
(ord(s[i])-ord('A')+ n)%26+ord('A') 이 식은.. 26으로 나눈 나머지를 반환해 초기값과 더함으로써 무조건 올바른 문자를 반환하도록 한다.
새로 써보자.
def solution(s, n):
tmp = [ord(x) for x in s]
A = ord('A')
a = ord('a')
space = ord(' ')
for i in range(len(s)):
if tmp[i] == space:
continue
elif s[i].isupper():
tmp[i] = (tmp[i]-A+n) % 26 + A
else:
tmp[i] = (tmp[i]-a+n) % 26 + a
answer = [chr(y) for y in tmp]
return ''.join(answer)
훨씬 간단한 풀이가 되었다.
더 간단한 풀이
▼
def solution(s, n):
tmp = [ord(x) for x in s]
A, a, space = ord('A'), ord('a'), ord(' ')
for i in range(len(s)):
if tmp[i] == space:
continue
elif s[i].isupper():
tmp[i] = (tmp[i]-A+n) % 26 + A
else:
tmp[i] = (tmp[i]-a+n) % 26 + a
answer = [chr(y) for y in tmp]
return ''.join(answer)
'프로그래머스 > Lv. 1' 카테고리의 다른 글
31. 두 개 뽑아서 더하기 (itertools - combinations) (0) | 2024.07.14 |
---|---|
30. 가장 가까운 같은 글자 (dict의 활용, 관련 함수들) (1) | 2024.07.14 |
28. 최소직사각형 ★ (0) | 2024.07.14 |
27. 삼총사 (itertools - combinations) (0) | 2024.07.12 |
26. 이상한 문자 만들기 (enumerate) (0) | 2024.07.12 |