코딩테스트 메모

SUSU·2023년 10월 28일
0

시저암호

(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 가 되어야 한다

    • 90 + 5 가 69가 되어야 하는거시다.............. 90 + 5 = 65 + 5 - 1
  • 하나 더, Y인 경우 +5 를 하면 D 가 되어야 한다.

    • 89 + 5 가 68가 되어야 하므로................. 89 + 5 = 65 + 5 - 2
  • 하..하나만 더, P인 경우 +5 를 하면 U 가 되어야 한다.

    • 80 + 5 라 85라고 하면 되지만 표현법을 맞춰보자.. 80 + 5 = 65 + 5 -(-15)...?

    ㅆㅃ... 이게 아닌거다 일반화 할수가 없는거다.........

그렇다.안전빵으로 대문자는 대문자, 소문자는 소문자로 가장 작은숫자로 빼줘서
+n을 해도 범위를 초과하지 않게 한다음 다시 원래대로 돌려놓는 개 뻘짓을 해야하는거다.

  • Z인 경우 +5 를 하면 E 가 되어야 한다
    • 90 + 5 가 69가 되어야 한다. 90-65+5 여기까지 하면 30이다.
  • 하나 더, Y인 경우 +5 를 하면 D 가 되어야 한다.
    • 89 + 5 가 68가 되어야 하므로 89-65+5 여기까지 하면 29이다.
  • 하..하나만 더, P인 경우 +5 를 하면 U 가 되어야 한다.
    • 80 + 5 가 80-65+5 여기까지 하면 20이다.

각각 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개 문자열로 박고 시작하는게 더 나한테 맞는거 같단 생각이 들었다.
가볍게 한문제 풀고 시작하려다 두시간 순삭했네

profile
기록용

0개의 댓글