코린이의 공부일기

[Python]프로그래머스 LEVEL1> 시저암호 본문

STUDY/[Python] Coding Test

[Python]프로그래머스 LEVEL1> 시저암호

SOJUNG 2021. 1. 29. 00:05

안녕하세요 ㅎㅎ 오늘은 프로그래머스 level1 문제 시저암호 리뷰를 하겠습니다ㅎㅎ

이 문제는 문자열에 관한 코딩테스트를 조금만 해봤다면 금방 할 수 있을 문제였다!

그치만 한번 테스트케이스 통과했다는 것에 바로 넘어가지않고 리뷰하고 다른 방법 이나 더 좋은 코드로 변환한다는 목표를 가지고 포스팅 하겠습니다~^_^

 

문제 설명

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

 

제한 조건

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

입출력 예

 

s n result
"AB" 1 "BC"
"z" 1 "a"
"a B z" 4 "e F d"

 

1 번째 문제풀이

나는 일단 처음에 이 문제를 정말 단순히 풀었다.

for-if-elif-else문을 만들어 대문자 일때(if), 소문자 일때(elif), 공백 일때(else)을 나누어 풀었다.

특히 알파벳 나타낼 때 문자열로 일일이 써서 넣었다 하지만 여기서 문제점이 s값에 z가 있고 n값이 1이상이라면 index값이 넘어가버려 오류가 나기때문에 이 점에서 해결을 index값은 가장 먼저나오는 index값을 나타내주기 때문에 alpa에 알파벳을 한번더 중복해서 넣었다. 어차피 z에 n만큼 밀어도 index값을 넘어가지 않기 때문에 오류는 없이(?) 코딩 할 수 있었다. 

def solution(s, n):
    alpa='ABCDEFGHIJKLMNOPQRSTUVWXYZ'*2
    alpa2=alpa.lower()
    answer=""
    
    for i in s:
        if i in alpa:
            answer+=alpa[alpa.index(i)+n]
        elif i in alpa2:
            answer+=alpa2[alpa2.index(i)+n]
        else:
            answer+=i
    
    return answer

 

2번 째 문제풀이

2번째 풀이에서 먼저 알고가야할 점!

아스키 코드 변환함수 : ord(), chr()

ord() : 특정 한 문자를 아스키 코드 값으로 변환해주는 함수

chr() : 아스키 코드 값을 문자로 변환해주는 함수 

 이 두 가지 함수기능만 안다면 더 빠르게 풀 수 있는 문제였다.

그리고 파이썬에서 알파벳의 순서를 부등호로 표현이 가능하다는 것도 알아가면 좋을 거 같다.

주어진 s값의 (아스키 코드 값 - 알파벳의 첫 시작(A or a)의 아스키코드 값 + n)을 알파벳 총 개수(26)로 나눈 나머지 값으로 내가 원하는 시저 암호를 얻을 수 있다ㅎㅎ

헷갈린다면 , 아스키코드 표와 함께보면 바로 이해할 수 있을것이다

def solution(s, n):
    answer = ''
    for i in s:
        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 +=i
    return answer

여기까지 포스팅 끝!!ㅎㅎ

잘못된 부분 지적은 환영입니다 ♡

Comments