나의 풀이 : 문자열 인덱싱 사용
def solution(s, n): low = "abcdefghijklmnopqrstuvwxyz" # 소문자. 인덱스는 0에서 25 up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" answer = '' for char in s: if char in low: ind = low.find(char)+n # low 문자열에서 찾은 해당 알파벳 인덱스 + n answer += low[ind%26] # 26으로 나눈 나머지를 사용할 경우 25를 초과하는 경우도 활용 가능 elif char in up: ind = up.find(char)+n answer += up[ind%26] else: # 공백일 경우도 고려 answer += " " return answer solution("a B z E", 4) # 'e F d I'
나는 아스키 코드를 사용하지 않고 소문자, 대문자를 각각 담은 문자열을 만들어 인덱싱 해 사용하였다.
알파벳은 26개, 인덱스는 0 ~ 25까지인데, n을 더하였을 때 25를 넘어갈 경우가 있기에
26으로 나눈 나머지를 사용하였다.
따라서
(1) 26보다 작을 경우 26으로 나눈 나머지는 그 숫자 자체이고 (예) 5%26 -> 5)
(2) 26 이상일 경우 26으로 나눈 나머지를 활용하면 다시 문자열 처음으로 돌아가 활용 가능하다.
(예) 26%26 -> 0, a / A를 의미)
만일 s에 공백이 주어질 경우를 대비해 else문도 넣어주었다.
모범 답안 : 아스키 코드 사용 (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) print(caesar("a B z", 4)) # 'e F d'
이 풀이를 보며 처음 알게 된 파이썬 함수들이다.
chr() 함수는 숫자를 인자로 주면 아스키 코드에 해당하는 문자를 반환하며 (아스키 코드 -> 문자)
ord() 함수는 문자의 아스키 코드를 반환한다. (문자 -> 아스키 코드)
아스키 코드를 활용할 경우, 나의 풀이에서와 같이 공백을 고려하지 않아도 되어 편리한 것 같다.
'Computer Science > Algorithms' 카테고리의 다른 글
[python] 프로그래머스 :: 서울에서 김서방 찾기 (0) | 2019.10.29 |
---|---|
[python] 프로그래머스 - 수박수박수박수박수박수? (0) | 2019.10.29 |
[python] 프로그래머스 - 약수의 합 (효율적으로 풀기) (0) | 2019.10.29 |