둘만의 암호
문제 링크
문제 설명
두 문자열 's'와 'skip', 그리고 자연수 'index'가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.
- 문자열 's'의 각 알파벳을 'index'만큼 뒤의 알파벳으로 바꿔줍니다.
- 'index'만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
- 'skip'에 있는 알파벳은 제외하고 건너뜁니다.
예를 들어 's' = "aukks", 'skip' = "wbqd", 'index' = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [ b, c, d, e, f ]에서 "b"와 "d"는 'skip'에 포함되므로 세지 않습니다. 따라서 "b", "d"를 제외하고 "a"에서 5만큼 뒤에 있는 알파벳은 [ c, e, f, g, h ] 순서에 의해 "h"가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.
두 문자열 's'와 'skip', 그리고 자연수 'index'가 매개변수로 주어질 때 위 규칙대로 's'를 변환한 결과를 return 하도록 solotion 함수를 완성해 주세요.
제한 조건
- 5 <= 's'의 길이 <= 50
- 1 <= 'skip'의 길이 <= 10
- 's'와 'skip'은 알파벳 소문자로만 이루어져 있습니다.
- 'skip'에 포함되는 알파벳은 's'에 포함되지 않습니다.
- 1 <= 'index' <= 20
입출력 예
s | skip | index | result |
"aukks" | "wbqd" | 5 | "happy" |
입출력 예 설명
입출력 예#1
본문 내용과 일치합니다.
해결 과정
'skip'에 포함된 알파벳 제거를 replace 함수를 써서 처리할 수 있지만 정규표현식과 sub 함수로 특정문자를 제거해 보았습니다.
# |는 OR의 의미로, 여러 패턴을 추가할 때 사용
re.sub(pattern, repl, string, count=0, flags=0)
파이썬 정규식 연산을 위한 re 모듈을 import 해주고 skip 데이터 제거를 위해 sub 함수 parameter에 바로 넘길 수 있도록 변환해 줍니다. 이후 z에서 'index'가 더해져 a로 다시 넘어갈 것을 대비해 spell의 길이를 3배 늘려줍니다. 마지막으로 's'를 for loop 처리해서 하나씩 확인하면서 'skip'이 제거된 'spell'에서 'index'만큼 이동해 주고 join 함수로 string 변환하여 반환해 줍니다.
import re
def solution(s, skip, index):
skip = '|'.join([ x for x in skip ]) # 제거할 spell
spell = re.sub(skip, '', 'abcdefghijklmnopqrstuvwxyz') * 3 # z에서 a로 넘어갈 경우
return ''.join([ spell[spell.index(y)+index] for y in s ]) # index만큼 옮겨서 반환
또 다른 풀이
from string import ascii_lowercase
def solution(s, skip, index):
result = ''
a_to_z = set(ascii_lowercase)
a_to_z -= set(skip)
a_to_z = sorted(a_to_z)
l = len(a_to_z)
dic_alpha = { alpha:idx for idx, alpha in enumerate(a_to_z) }
for i in s:
result += a_to_z[(dic_alpha[i] + index) % l]
return result
string 모듈에서 ascii_lowercase 함수를 사용하여 알파벳 소문자 목록을 만들어 주었습니다. string 형태로 반환되며 대문자 목록이 필요할 경우 ascii_uppercase를 사용하면 됩니다.
'''
The lowercase letters 'abcdefghijklmnopqrstuvwxyz'.
This value is not locale-dependent and will not change.
'''
string.ascii_lowercase
'''
The uppercase letters 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
This value is not locale-dependent and will not change.
'''
string.ascii_uppercase
'ALGORITHM > Programmers' 카테고리의 다른 글
[Python] programmers, 최솟값 만들기 Lv.2 (feat.sum, zip, sorted, 한줄) (13) | 2023.02.10 |
---|---|
[Python] programmers, 체육복 Lv.1 (feat.그리디, 실패, 테스트 케이스) (9) | 2023.02.08 |
[Python] programmers, 폰켓몬 Lv.1 (feat.시간 초과, 해시, 한줄) (8) | 2023.02.06 |
[Python] programmers, 기사단원의 무기 Lv.1 (feat.시간 초과) (12) | 2023.02.02 |
[Python] programmers, 프로그래머스 소수 찾기 Lv.1 (feat.에라토스테네스의 체) (3) | 2023.02.01 |