(https://school.programmers.co.kr/learn/courses/30/lessons/12926)
처음에
alpabet = "ABCDEFGFIJKLMNOPQRSTUVWXYZ" ~
이렇게 박고 시작했다가 이렇게 풀리가없지~ 하고 찾아봄.
chr(i) : 유니코드를 입력받으면 숫자로 리턴하는 함수
ord(n)는 유니코드 숫자 값을 입력받아 그 코드에 해당하는 문자를 리턴하는 함수
대문자 'A'의 아스키 코드: 65
대문자 'Z'의 아스키 코드: 90
소문자 'a'의 아스키 코드: 97
소문자 'z'의 아스키 코드: 122
그리고 나면 숫자 놀이다
단순하게 숫자로 변환한 상태에 n 을 더하면 알파벳 이외의 숫자로 넘어가는 구간이 있기 때문에 보완을 해줘야 한다.
다만 나는 수학적 머리가 별루 없기 때문에 일단 일반화를 하기 위해서 예시를 많이 들어보았다.
Z인 경우 +5 를 하면 E 가 되어야 한다
하나 더, Y인 경우 +5 를 하면 D 가 되어야 한다.
하..하나만 더, P인 경우 +5 를 하면 U 가 되어야 한다.
ㅆㅃ... 이게 아닌거다 일반화 할수가 없는거다.........
그렇다.안전빵으로 대문자는 대문자, 소문자는 소문자로 가장 작은숫자로 빼줘서
+n을 해도 범위를 초과하지 않게 한다음 다시 원래대로 돌려놓는 개 뻘짓을 해야하는거다.
각각 30,29,20을 69,68,85로 만들어야 한다.대가리 깨짐
참고한 풀이는 30,29,20을 26으로 나눴을때 나머지를 구해서 65에 더해줬는데..
n이 1 이상, 25이하인 자연수라 그런건 알겠는데 저렇게 사고한 경위가 도~ 저히~ 이해가 안간다.ㅠ
암튼 쓰자면 이렇게 된다
(ord(alpbt)+ord('A') +n) %26 +ord('A')
이거를 대소문자 각각 if 문으로 분리해준후
chr(i)함수를 쓰면 된다.
근데 이렇게만 하면 공백이 있는 경우 답이 안나와서 다시 보완을 해줘야 한다
def solution(s, n):
answer = ''
for alpbt in s:
if alpbt.islower():
answer += chr((ord(alpbt) - ord('a') + n )%26 + ord('a'))
print("s",answer)
elif alpbt.isupper():
answer += chr((ord(alpbt) - ord('A') + n )%26 + ord('A'))
print("L",answer)
elif alpbt == " ":
answer += " "
return answer
하........이게 참말인가.. 이게 최선인가 ㅠ
어차피 알파벳 26개 문자열로 박고 시작하는게 더 나한테 맞는거 같단 생각이 들었다.
가볍게 한문제 풀고 시작하려다 두시간 순삭했네