[프로그래머스] Lv1 - 시저 암호

김멉덥·2023년 7월 22일
0

알고리즘 공부

목록 보기
66/171
post-thumbnail
post-custom-banner

문제

프로그래머스 연습문제


코드 구현

def solution(s, n):
    answer = ''

    for i in s:

        # 소문자인 경우
        if(i.islower()):
            current_ord = ord(i) + n        # 현재 문자에 n만큼 이동한 아스키코드 값
            if(current_ord > ord('z')):     # 만약 최대 알파벳인 z를 넘어가는 값이라면, 다시 a부터 순환하도록 해야하므로 값을 바꿔줘야 한다.
                answer += chr(ord('a') + (current_ord - ord('z') - 1))      # z를 넘어서 이동한 만큼의 값을 다시 a부터 이동하면 된다.
            else:
                answer += chr(current_ord)

        # 대문자인 경우
        if (i.isupper()):
            current_ord = ord(i) + n
            if (current_ord > ord('Z')):
                answer += chr(ord('A') + (current_ord - ord('Z') - 1))
            else:
                answer += chr(current_ord)

        # 공백인 경우
        if(i == ' '):
            answer += ' '

    return answer

풀이

  • 보자마자 아스키코드로 변환하여 n만큼 더해주고, 이를 이용해 다시 문자로 변환하면 편할 것 같다는 생각에 ord(), chr()을 검색하여 사용하였다.
  • 현재 문자를 아스키코드로 변환하고 → n만큼 더해준다.
  • 만약 n만큼 더해준 값이 소문자, 대문자의 끝인 zZ보다 큰 아스키코드 값을 가진다면, z보다 얼만큼 더 멀리 이동했는지 뺄셈으로 구하여 a의 아스키코드 값에서 다시 더해줘야 한다.
    • ex ) 현재 문자가 C이고, n이 25라면
      C 아스키코드 = 67
      → 67 + 25 = 92
      → 대문자의 끝인 Z의 아스키코드 = 90
    • 90이 끝이므로 91부터는 다시 A로 계산되어야 한다. 즉, 65 + (92 - 90 - 1) 을 하면 Z를 넘어서 다시 A부터 시작할 때 무슨 문자인지 나온다.
      (A의 아스키코드 + (초과된 아스키코드 값 - Z의 아스키코드 - 1))
    • 65 + (92 - 90 - 1) = 66, 정답 : B
  • 공백이면 공백을 넣어준다.

What I learned

▶️ 리스트를 이용한 코드

def caesar(s, n):
    lower_list = "abcdefghijklmnopqrstuvwxyz"
    upper_list = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    result = []

    for i in s:
        if i is " ":
            result.append(" ")
        elif i.islower() is True:
            new_ = lower_list.find(i) + n
            result.append(lower_list[new_ % 26])
        else:
            new_ = upper_list.find(i) + n
            result.append(upper_list[new_ % 26])
    return "".join(result)

▶️ 문자열도 부등호로 비교 가능

def solution(s, n):
    answer = ''
    for i in s:
        if i:
            if i >= 'A' and i <= 'Z':
                answer += chr((ord(i) - ord('A') + n) % 26 + ord('A'))
            elif i >= 'a' and i <= 'z':
                answer += chr((ord(i) - ord('a') + n) % 26 + ord('a'))
            else : answer += ' '
    return answer

▶️ ord(), chr()
참고 : https://lsjsj92.tistory.com/201

>>> # 소문자
s = 'a'
print(ord(s))   # 97
s = 'z'
print(ord(s))   # 122
print(chr(97))  # 'a'

>>> # 대문자
s = 'A'
print(ord(s))   # 65
s = 'Z'
print(ord(s))   # 90
print(chr(90))  # 'Z'

>>> # 소문자의 아스키코드 범위 : 97 ~ 122
>>> # 대문자의 아스키코드 범위 : 65 ~ 90
profile
데굴데굴 뚝딱뚝딱 개발기록
post-custom-banner

0개의 댓글