https://school.programmers.co.kr/learn/courses/30/lessons/155652
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
두 문자열 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은 알파벳 소문자로만 이루어져 있습니다.
- 1 ≤ index ≤ 20
코드
# Lv.1
# 둘 만의 암호
def solution(s, skip, index):
answer = []
for cha in s:
now_i = ord(cha)
check = 1
i = 1
while check <= index:
if now_i + i > 122: # 만약 z 다음이라면 다시 a로
i -= 26
next_cha = chr(now_i + i)
if next_cha not in skip:
check += 1
i += 1
answer.append(chr(now_i + i - 1))
answer = ''.join(answer) # string으로 변환
return answer
알고리즘
1. 바꾸려는 문장인 s의 각 글자마다 아래를 반복한다.
2. cha를 index만큼 뒤의 글자로 변환하기 위해 아스키 코드를 이용한다.
3. index만큼 아스키 코드 값을 하나씩 변환하는데, 아래 조건에 따라 달리 처리한다.
4. 만약 z라면 다음 글자는 a로 설정한다.
5. 만약 skip 속에 포함된 글자라면 check 값을 추가하지 않는다. i 값은 반복마다 1씩 추가한다.
6. 그러면 check 값을 기준으로 index만큼 뒤 순서의 글자로 변환하되 skip에 포함된 글자는 제외하고 지정할 수 있다.
피드백
index만큼 뒤의 글자를 설정하되, skip은 뛰어넘기 위해서 코드를 어떻게 구현해야 하는지 헷갈렸었다. 그래서 조건대로 체크할 수 있는 check 변수와 최종적으로 원래 글자의 아스키 코드에서 얼마나 더해야 하는지를 알 수 있는 i 변수를 따로 만들었다.
예로 index 값이 1이고, skip은 'b'고, s 값은 'a'라고 가정한다. 그러면 index의 조건대로라면 'a'의 1만큼 다음 글자는 'b'지만 skip에 포함된 값으로 'c'가 최종 답이 된다. 그러면 실제로 'a'의 아스키 코드에서 2를 더해야 'c'로 변환할 수 있다. 실제로 더하는 아스키 코드 값이 i고 index의 제한을 확인하고자 하는 값이 check라고 이해하면 된다.
'Python 알고리즘 공부 > 프로그래머스 코딩테스트 연습' 카테고리의 다른 글
크기가 작은 부분문자열 (python) (0) | 2023.05.22 |
---|---|
개인정보 수집 유효기간 (python) (1) | 2023.05.21 |
달리기 경주 (python) (0) | 2023.05.16 |
광물 캐기 (python) (0) | 2023.05.13 |
공원 산책 (python) (0) | 2023.05.13 |
댓글