[프로그래머스]시저 암호 - 파이썬

Donghyun·2024년 7월 3일
0

Code Kata - 파이썬

목록 보기
4/54
post-thumbnail

링크: https://school.programmers.co.kr/learn/courses/30/lessons/12926

문제 설명

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

제한 조건

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

입출력 예

snresult
"AB"1"BC"
"z"1"a"
"a B z"4"e F d"

문제풀이

문자열에 순서가 있는 걸로 아는데 어떻게 접근하지?

  • 소문자 → a ~ z 에서 일치하는 인덱스를 찾고 인덱스 + n 해서 answer 에 추가
  • 대문자도 마찬가지

근데, a ~ z 리스트 내에서 일치하는 인덱스를 찾는 방법 말고 컴퓨터가 읽을 수 있게 숫자로 변환하는 내장함수가 있을 거 같다. 그래서 검색해봤더니 역시 있었다.

아스키코드

: 기호와 영문알파벳에 적합한 문자 인코딩

이미지 출처: https://namu.wiki/w/아스키 코드

a ~ z : 97 ~ 122

A ~ Z : 65 ~ 90

이제 문자열을 아스키코드(숫자)로 접근하는 방법을 알았으니 파이썬에서는 어떻게 적용하는지 알아보면

  • ord() : 문자열을 아스키코드로 변환
  • chr() : 아스키코드를 문자열로 변환

수도코드

위의 내용들을 활용해 수도코드를 만들어보면 다음과 같이 할 수 있을거 같다.

for i in s:
	if i 는 공백이면:
		답에 그대로 공백 추가
	elif i 가 대문자이면:
		if i 를 아스키코드로 변환하고 n 을 더했을 때 z 보다 크다면:
			~ ~ 
		else:
			아스키코드로 변환 후 + n 한 것을 다시 문자열로 변환해서 답에 추가
	elif i 가 소문자이면:
		마찬가지

여기서 이제 생각해 봐야 할 점은

  • n 을 더했을 때 z 를 넘어서는 걸 어떻게 다룰 것인가?

ex) s = ‘z’, n = 4 → 결과는 d 가 나와야 한다.

  • z 의 아스키코드: 122, 결과인 d 의 아스키코드: 100
  • 따라서 (122 + 4) - ? = 100 이 나와야 한다.
  • ? 에 소문자 아스키코드의 최대값인 (122 + 1) 그리고 여기에 최소값, 즉 a 의 아스키코드인 97을 더해주면?
  • (122 + 4) - 123 + 97 = 100 이 성립한다.

위의 로직들을 하나의 구문으로 합치면 완성

최종코드

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

    for i in s:
        if i == ' ':
            answer += i
        elif i.isupper():
            if ord(i) + n > 90:
                answer += chr((ord(i) + n - 91) + 65)
            else:
                answer += chr(ord(i)+n)
        elif i.islower():
            if ord(i) + n > 122:
                answer += chr((ord(i) + n - 123) + 97)
            else:
                answer += chr(ord(i) + n)

    return answer
profile
데이터분석 공부 일기~!

0개의 댓글