[파이썬 코딩테스트] 시저 암호

ch.2·2024년 7월 17일
0

코딩 테스트

목록 보기
12/21
post-thumbnail

문제

프로그래머스 연습 문제

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

아스키코드값으로 반환하는 함수를 사용하거나, 영어 대문자와 소문자를 각각 담은 문자열을 만들어 인덱싱을 사용해서 풀어야 한다.

답안

def solution(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)

if s[i].isupper():

  • str.isupper(): is uppper. 문자열 중 소문자가 있는지 검사하는 함수. 모두 대문자이면 True를 반환하고, 소문자가 하나라도 있으면 False를 반환한다.

  • str.islower(): is lower. str.isupper()의 반대 개념. 문자열 중 대문자가 있는지 검사하는 함수.

s[i] = chr((ord(s[i]) - ord('A') + n)%26 + ord('A'))

  • chr()
    : 아스키 코드 값을 입력받아 그 코드에 해당하는 문자를 출력하는 함수.
    아스키 코드(숫자) → 문자

  • ord()
    : 문자의 아스키 코드 값을 돌려주는 함수.
    문자 → 아스키코드(숫자)

  • ord(s[i]) - ord('A') + n
    :아스키코드 값은 문자뿐만 아니라 NULL, 특수문자, 숫자 등 다양한 개념을 표현할 수 있다.
    영어 대문자 시작인 'A'의 아스키코드 값은 65 이므로 s[i]의 아스키코드 값에서 65를 빼고, 문자를 미는 거리 n만큼 더해주는 의미이다.

  • %26
    :알파벳이 26개이기 때문에 앞에서 연산한 값을 26으로 나누어 나머지 값을 구해, 연산한 결과가 알파벳 대문자 범위 내에서만 순환하도록 하기 위해 작성한다.
    %26으로 인해 이전의 연산 결과가 다시 0부터 25 사이의 값이 된다.

  • 이후 이 값을 chr() 을 통해 아스키 코드의 값을 알파벳 문자로 바꾸어 s의 인덱스로 저장한다.


같은 원리로 문자열이 소문자인 경우에도 코드를 작성해준다.

return ''.join(s)

  • 리스트 s.join() 함수를 이용하여 하나의 문자열로 만들어 반환한다.


ASCII: 아스키 코드

이미지 출처: GeeksforGeeks

아스키코드는 문자, 숫자, 문장 부호 및 기타 기호에 고유한 숫자 값을 할당하는 문자 인코딩 표준어이다.

아스키코드를 사용하면 사람이 읽고 확인할 수 있는 정보를 컴퓨터에 저장할 수 있다. 이를 통해 컴퓨터가 표현할 수 없는 정보도 저장할 수 있으며, 사람의 의도와 컴퓨터의 코드 사이를 연결하는 역할을 한다.


다른 사람의 답안

def solution(s, n):
    low = "abcdefghijklmnopqrstuvwxyz" # 소문자. 인덱스는 0에서 25
    up = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    answer = ''
    for char in s:
        if char in low:
            ind = low.find(char)+n # low 문자열에서 찾은 해당 알파벳 인덱스 + n
            answer += low[ind%26] # 26으로 나눈 나머지를 사용할 경우 25를 초과하는 경우도 활용 가능
        elif char in up:
            ind = up.find(char)+n
            answer += up[ind%26]
        else: # 공백일 경우도 고려
            answer += " "
    return answer

문자열 인덱싱 사용

profile
데이터 분석 공부중

0개의 댓글