728x90
문제 설명
- 두 문자열 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하도록 solution 함수를 완성해주세요.
제한사항
- 5 ≤ s의 길이 ≤ 50
- 1 ≤ skip의 길이 ≤ 10
- s와 skip은 알파벳 소문자로만 이루어져 있습니다.
- skip에 포함되는 알파벳은 s에 포함되지 않습니다.
- 1 ≤ index ≤ 20
# 예제를 정한다.
s = "aukks"
skip = "wbqd"
index = 5
# 결과 값으로 'happy'가 출력되야 한다.
# string 라이브러리에서 소문자 알파벳 리스트를 부러온다.
from string import ascii_lowercase
def solution(s, skip, index):
# 리스트 내 for문으로 알파벳리스트의 값이 skip 들어있지 않은 값만 alphabet에 할당한다.
alphabet = [x for x in ascii_lowercase if x not in skip]
# 예제 index 값과 달리 index의 값이 alphabet보다 훨씬 많을 수 있다.
# 나머지 값을 이용하여 index를 다시 정해준다.
index = index % len(alphabet)
# 답을 적을 answer 변수를 만든다.
answer=''
# for문을 돌려 문자열 s의 값 하나하나를 i에 할당한다.
for i in s:
# 만약 i와 같은 alphabet의 요소의 인덱스 값 + index 값이 alphabet의 길이보다 길다면
if alphabet.index(i)+index >= len(alphabet):
# i와 같은 alphabet의 요소의 인덱스 값 + index 값에서 alphabet의 길이만 큼
# 빼준 인덱스값에 해당하는 alphabet을 찾아 answer에 더한다.
answer += alphabet[(alphabet.index(i)+index)-len(alphabet)]
else:
# i와 같은 alphabet의 요소의 인덱스 값 + index 값이 alphabet보다 작다면
# 그 값에 해당하는 alphabet 값을 answer에 넣는다.
answer += alphabet[alphabet.index(i)+index]
return answer
solution(s, skip, index)
# 'happy'
다른 사람의 풀이
from string import ascii_lowercase
def solution(s, skip, index):
result = ''
# 알파뱃리스트를 집합으로 바꿔서 a_to_z에 할당한다.
a_to_z = set(ascii_lowercase)
# 집합 데이터타입의 특성으로
# a_to_z(알파벳집합)에서 set(skip)(빼야되는 알파벳 집합)을 빼준다.
a_to_z -= set(skip)
# skip요소가 빠진 a_to_z를 정렬한다.
a_to_z = sorted(a_to_z)
# 정렬된 a_to_z의 길이를 구한다.
l = len(a_to_z)
# enumerate를 사용해 각 인덱스값과 인덱스에 해당하는 요소값을 딕셔너리 파일로 만들어
# dic_alpha에 할당한다.
# dic_alpha = {'a': 0,'c': 1,'e': 2,'f': 3,'g': 4,'h': 5,'i': 6,'j': 7,....}
dic_alpha = {alpha:idx for idx, alpha in enumerate(a_to_z)}
# for 문을 돌려 문자열 s의 요소 하나하나를 i에 대입한다.
for i in s:
# i에 a를 집어넣었을 때
# dic_alpha[a]는 0이된다.
# index는 5이므로 0 + 5 = 5
# 여기서 만약 dic_alpha[i] + index 값이 a_to_z의 범위를 벗어날 수 있으므로
# len(a_to_z) 값으로 나눈 후 나머지를 구한다.
# len(a_to_z)는 22 이므로
# 5에서 22를 나누면 몫은 0이요, 나머지는 5이다.
# a_to_z[5]의 값은 'h'가 된다.
result += a_to_z[(dic_alpha[i] + index) % l]
# for문으로 반복을 마치고 result값을 반환한다.
return result
728x90
'코딩 테스트' 카테고리의 다른 글
9. 가운데 글자 가져오기 - 프로그래머스 코딩테스트 (0) | 2023.02.20 |
---|---|
8. 2016년 - 프로그래머스 코딩테스트 (0) | 2023.02.20 |
6. 폰켓몬 - 프로그래머스 코딩 테스트 (0) | 2023.02.20 |
5. 로또 최고 순위와 최저 순위 - 프로그래머스 코딩테스트 (0) | 2023.02.20 |
4. 성격 유형 검사 - 프로그래머스 코딩테스트 (0) | 2023.02.20 |