프로그래머스 Lv.1 시저 암호

서준·2023년 6월 16일
0

프로그래머스 Lv.1

목록 보기
29/35

1. 문제

어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.

  • 제한사항
    공백은 아무리 밀어도 공백입니다.
    s는 알파벳 소문자, 대문자, 공백으로만 이루어져 있습니다.
    s의 길이는 8000이하입니다.
    n은 1 이상, 25이하인 자연수입니다.

2. 풀이

1차 시도(실패)

def solution(s, n):
    answer = ''
    # ASCII 저장할 변수
    tmp = 0
    for i in range(0, len(s)):
        # 공백일때
        if s[i] == ' ':
            answer += ' '
            continue
        # 소문자 일때
        if s[i].islower:
            tmp = ord(s[i]) + n
            # z를 넘어가면 a로 돌리기
            if tmp > 122:
                tmp -= 26
            answer += chr(tmp)
        elif s[i].isupper:
            tmp = ord([i]) + n
            # Z를 넘어가면 A로 돌리기
            if tmp > 90:
                tmp -= 26
            answer += chr(tmp)
    return answer
  • 테스트 케이스 일부에서 계속 실패가 뜬다.

2차 시도 (성공)

def solution(s, n):
    answer = ''
    # ASCII 저장할 변수
    tmp = 0
    for i in range(0, len(s)):
        # 공백일때
        if s[i] == ' ':
            answer += ' '
            continue
        # 소문자 일때
        if s[i].islower():
            tmp = ord(s[i]) + n
            # z를 넘어가면 a로 돌리기
            if tmp > 122:
                tmp -= 26
            answer += chr(tmp)
        elif s[i].isupper():
            tmp = ord(s[i]) + n
            # Z를 넘어가면 A로 돌리기
            if tmp > 90:
                tmp -= 26
            answer += chr(tmp)
    return answer
  • 억장 무너지네. islower()이렇게 선언해야한다.
  • ()이거 꼭 있어야한다.
  • 근데 왜 에러가 안떴지?

3. Lv.up

  1. 문자 to ASCII
    ord('A')
  2. ASCII to 문자
    chr(45)

4. Ref.

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)
  • 내가 고민했던 부분도 추가되어있다. 만약 반복횟수가 여러번일때의 예외처리를 해놓았다.
  • 내가 고민만하고 구현은 안한 이유는 제한사항에서 n을 25로 제한했기 때문이다.
profile
어린이입니다.

0개의 댓글