728x90
def solution(s, n):
answer = ''
for i in s:
if (i.isalpha()):
num = ord(i) # 문자 -> 숫자 변환
if num>=97:
num = (num-97+n)%26 + 97
else:
num = (num-65+n)%26 + 65
i = chr(num) # 숫자 -> 문자 변환
answer += i
return answer
<내 풀이 분석>
1. 한 글자씩 뽑아 알파벳인지 확인, 알파벳이라면 아스키코드값으로 변환 후 소문자인지(num>=97)확인
2. 소문자라면 97을 빼준 후 n을 더하여 나머지 연산지를 취함.(순환 배열을 구현하기 위한 나머지연산자. 알파벳 개수 26개) 그리고 97을 더해 원래 값을 얻음
3. 대문자라면 2번에서 97대신 65를 빼주고 더해줌
4. i값을 다시 문자로 변환하여 answer에 더해줌(문자열 붙이기)
5. 알파벳이 아니라면 그 값을 그냥 answer에 더해줌
+) 순환배열
(0+1)%26 = 1
(1+1)%26 = 2
(2+1)%26 = 3
...
(22+1)%26 = 23
(23+1)%26 = 24
(24+1)%26 = 25
(25+1)%26 = 0
(26+1)%26 = 1
(27+1)%26 = 2
=> 어떤 값이 더해지든 항상 0~25 인덱스 내부 값으로 순환됨
+) 개선한 풀이
def solution(s, n):
answer = ''
for i in s:
if i.islower():
i = chr((ord(i)-ord('a')+n)%26 + ord('a'))
else:
i = chr((ord(i)-ord('A')+n)%26 + ord('A'))
answer += i
return answer
- isupper()는 isalpha()를 포함하는 느낌이라서 isalpha()를 굳이 쓸 필요 없다.
- 굳이 num이라는 변수를 만들지 않고 바로 쓰는 게 가독성이 좋은 것 같다.
- 97이라는 숫자보단 ord('a')를 이용하여 의도가 드러나도록 하는 게 좋을 것 같다.
def solution(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)
(좋아요를 가장 많이 받은 풀이)
이렇게 인덱스로 접근해서 바로 대입할 수 있게 만들 수도 있다.
728x90
'알고리즘 > programmers[1]' 카테고리의 다른 글
[프로그래머스] 최대공약수와 최소공배수: python3 (0) | 2022.01.26 |
---|---|
[프로그래머스] 자릿수 더하기: python3 (0) | 2022.01.25 |
[프로그래머스] 제일 작은 수 제거하기 (0) | 2022.01.25 |
[프로그래머스] 소수 찾기: python3 (0) | 2022.01.25 |
[프로그래머스] 문자열 내림차순으로 배치하기: python3 (0) | 2022.01.25 |