시저암호

yongju·2022년 11월 2일
0

Programmers

목록 보기
1/23
post-thumbnail

프로그래머스 레벨1 [정답율 70%]

문제 정리
사용할 파라미터:
s 문자열 받아오기(string)
n 어느정도 밀것인지(int)

  • 아스키 코드상에서는 한칸 민다 == 아스키코드 넘버 1상승
    ascii 아스키 코드 저장공간(list,int)
    chagned_s 밀어서 변한 문자열 저장(list,string)

고려할 점
1. 대문자로 입력받은것은 아무리 돌아도 대문자로 반환해야함
2. 소문자로 입력받은것은 아무리 돌아도 소문자로 반환해야함
- 소문자 아스키코드 보다 큰 숫자는 전부 소문자로 다시 돌아와야함.

코드

def solution(s,n):
    ascii,changed_s=[], []
    for i in range(len(s)):
        ascii.append(ord(s[i]))#아스키 코드로 변환(int)

    for x in ascii:
        checking=x+n
        if chr(x).isupper():#대문자로 시작하는경우
            if checking>ord("Z"):#대문자 루프를 넘어간다면
                while checking:# 대문자에서 루프 넘어가지 않도록
                    checking=checking-26
                    if ord("A")<=checking<=ord("Z"):
                        break
                changed_s.append(chr(checking))
            else: #대문자 시작 대문자 종료
                changed_s.append(chr(checking))

        if chr(x).islower():#소문자로 시작하는 경우
            if checking>ord("z"): #소문자 루프 넘어간다면
                changed_s.append(chr(checking-26))
            else:#소문자 시작 소문자 종료
                changed_s.append(chr(checking))

        if chr(x)==" ": #공백인 경우
                changed_s.append(chr(x))

    answer="".join(changed_s)
    return answer

코드 설명

ascii,changed_s=[], []
    for i in range(len(s)):
        ascii.append(ord(s[i]))#아스키 코드로 변환(int)

입력받은 s를 ord를 사용하여 아스키 코드(10진수)를 얻어서 ascii에 저장

        checking=x+n
        if chr(x).isupper():#대문자로 시작하는경우
            if checking>ord("Z"):#대문자 루프를 넘어간다면
                while checking:# 대문자에서 루프 넘어가지 않도록
                    checking=checking-26
                    if ord("A")<=checking<=ord("Z"):
                        break
                changed_s.append(chr(checking))
            else: #대문자 시작 대문자 종료
                changed_s.append(chr(checking))

대문자로 시작할 경우, 두 경우로 나눈다.

  • 대문자가 루프를 넘어간 경우
  • 대문자가 루프 내에 있는 경우

대문자가 루프를 넘어간 경우, while문을 사용하여 옮겨진 아스키코드의 수가 A와 Z사이에 위치하도록 알파벳 개수만큼 반복하여 빼준다. 이때, 변한(옮겨진) 아스키 코드의 수가 대문자 루프에 위치한다면, while문을 탈출한다.
루프내에 있는 경우, 옮겨진 아스키코드를 문자로 바꾸어 출력한다.

 if chr(x).islower():#소문자로 시작하는 경우
            if checking>ord("z"): #소문자 루프 넘어간다면
                changed_s.append(chr(checking-26))
            else:#소문자 시작 소문자 종료
                changed_s.append(chr(checking))

소문자로 시작한 경우, 두 경우로 나눈다.

  • 소문자라 루프를 넘어간 경우
  • 소문자가 루프 내에 있는 경우

소문자가 루프를 넘어간 경우, 알파벳 숫자만큼 아스키코드에서 빼주어 chr을 이용하여 문자로 바꿔준다.
루프내에 있는 경우, 옮긴 아스키코드 숫자를 문자로 바꿔준다.

if chr(x)==" ": #공백인 경우
                changed_s.append(chr(x))

공백인 경우 그대로 공백문자를 출력한다.

    answer="".join(changed_s)

바뀐 문자열을 저장하는 changeds는 list이기에 join_을 사용하여 문자열로 바꿔준다.

Helper

velog.io/@aydenote님의 글을 참고하여 제 코드의 문제점을 발견하였습니다.

profile
AI dev

0개의 댓글