문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/155652
소스 코드
def solution(s, skip, index):
skip = [ord(x) for x in skip] # 생략할 번호
alpha_num = [x for x in range(97,123) if x not in skip]
answer = [ ]
for idx in range(len(s)):
char_num = alpha_num.index(ord(s[idx])) # 리스트에서의 인덱스 구하기
if char_num + index < len(alpha_num): # 리스트 범위 내의 경우
answer.append(chr(alpha_num[char_num + index]))
else: # 리스트 범위를 벗어나는 경우
answer.append(chr(alpha_num[(char_num+index) % len(alpha_num)]))
return ''.join(answer)
해설
- 문자열, 구현
- chr, ord 함수
skip에 포함된 문자들은 문자 순서를 셀 때 제외해야 합니다.
따라서 순서에 포함된 문자들만 리스트를 만드는데, 저는 alpha_num 리스트에 담았습니다.
사실 alpha_num 리스트에 담긴 값들은 변수명처럼 숫자입니다.
여기서 잠시 ord, chr 함수에 대해 알아보죠!
ord, chr
ord 함수는 문자를 아스키 코드값으로 변환해주는 함수입니다.
반대로 chr 함수는 아스키 코드값을 문자로 변환해주는 함수입니다.
아스키코드는 문자와 대응되는 숫자값으로 구성한 일종의 부호 체계인데요, 정확히는 몰라도 괜찮습니다 ☺️
여기서는 간단히 'a'라는 문자가 97, 'z'라는 문자가 122에 해당한다는 것만 알아도 충분해요!
(대문자는 z 이후에 시작되어 123부터 시작하겠죠?)
그러니까 제가 작성한 코드는 97부터 122에 해당하는 숫자들 중에서 skip이 나타내는 숫자들을 제외한 것만 모아둔 것이 됩니다.
그래서 저는 우리가 확인하고 싶은 문자열 s의 각 글자를 살펴보면서, 그 문자열이 리스트의 몇 번 인덱스에 해당하는지 구했습니다.
alpha_num.index( )
이 부분이 ( ) 의 내용물이 alpha_num 라는 리스트의 어떤 인덱스에 해당하는지를 반환하는 것입니다.
저는 괄호 안에 ord(s[idx]) 라고 입력을 줬는데요, 이는 s[idx]에 해당하는 문자를 아스키 코드 숫자로 바꿔주는 것입니다.
따라서 숫자로 바꿔서 리스트 내 위치를 찾아줬다고 이해하시면 됩니다.
이제 이 숫자에 index 를 더하면 리스트 내의 정확한 위치를 알 수 있겠죠.
하지만 둘을 더한 값이 리스트의 길이를 벗어나게 되면 인덱스 에러가 발생할 것입니다.
따라서 if문을 통해 리스트의 길이를 벗어나는지 그렇지 않은지에 따라 구분하고, 범위를 벗어난 경우에는 리스트 길이로 나눈 나머지로 리스트에 접근하게 하면 됩니다!!
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 짝지어 제거하기 (Python) (0) | 2023.02.27 |
---|---|
[프로그래머스] 대충 만든 자판 (Python) (0) | 2023.02.26 |
[프로그래머스] 카드 뭉치 (Python) (0) | 2023.02.23 |
[프로그래머스] 크기가 작은 부분문자열 (Python) (0) | 2023.02.22 |
[프로그래머스] 가장 가까운 같은 글자 (Python) (0) | 2023.02.21 |