def solution(s, n):
lst = []
for element in s:
if element == " ":
lst.append(" ")
elif ord(element) >= 65 and ord(element) <= 90:
idx = ((ord(element) - 65 + (n % 26)) % 26) + 65
lst.append(chr(idx))
# lst.append(str([ord(element), idx]))
elif ord(element) >= 97 and ord(element) <= 122:
idx = ((ord(element) - 97 + (n % 26)) % 26) + 97
lst.append(chr(idx))
# lst.append(str([ord(element), idx]))
else:
continue
answer = "".join(lst)
return answer
결국은 f:N->N,x->y인 함수를 주어진 설명에 맞게 만드는 행위이다.
이때 나머지 정리를 잘 활용해야 하는데, 머리로만 생각한게 바로 들어맞지 않는다. 따라서 직접 하나씩 연산마다 어떻게 맵핑을 시켜 가야 하는지 적는 편이 낫다.
그리고 작은 스케일에서 함수를 짜본 다음에 큰 스케일로 넘어가는게 좋다. 이때 작은 스케일에서 엣지 케이스까지 처리해봐야 한다.
X = {a, b, c, d}
Y = {5, 6, 7, 8}
ord(a) = 5, ord(b) = 6, f(c) = 7, f(d) = 8
위와 같이 문자와 아스키 코드가 주어진 경우처럼 스케일 작게 해서 한번 흐름을 설명해본다.
주어진 문자의 아스키 코드에서의 인덱스값을 계산한다.
ord(X) - 5 = {0, 1, 2, 3}
앞으로 가야할 n을 4 안에서 순환하도록 값을 변경한다.
n % 4 = {0, 1, 2, 3}
n이 0 ~ 5을 넣어보면 모든 경우를 테스트 해볼 수 있다.
주어진 범위 안에서 순환하도록 변경한 n의 값을 인덱스 값에 넣어준다.
(ord(X) - 5) + (n % 4)
변경된 인덱스 값이 다시 4 안에서 순환하도록 값을 변경해준다.
(ord(X) - 5) + (n % 4) % 4
인덱스 값을 아스키 코드 값으로 다시 변환해준다.
((ord(X) - 5) + (n % 4) % 4) + 5