본문 바로가기
🔅코딩테스트 공부🔅/❗프로그래머스(Lv.1)

[프로그래머스] Level1 둘만의 암호(python)

by 윤무무 2023. 2. 10.

https://school.programmers.co.kr/learn/courses/30/lessons/155652

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 내가 작성한 코드
def solution(s, skip, index):


    arr = []
    result = []
    for i in range(97,123): #a~z까지 문자열 삽입
        arr.append(chr(i)) #아스키코드로 변환
    arr = list(sorted(set(arr) - set(skip))) #skip을 제외한 문자열

    print(arr)

    for i in list(s):
        if arr.index(i) + index > len(arr)-1:
            if arr.index(i) + index - len(arr) > len(arr) -1:
                result.append(arr[arr.index(i) + index - 2*len(arr)])
            else: result.append(arr[arr.index(i) + index - len(arr)])
        else: result.append(arr[arr.index(i) + index])

    return ''.join(result)

 

arr.index(i) + index , len(arr) 같이 중복되는 단어를 계속 사용해서 코드가 상당히 복잡한데,

 

이 경우는 변수를 선언해서 코드를 정리하는 것이 나을 거 같다. (귀찮아서 그냥 제출했음)

 

 

2. 런타임에러가 발생한 이유

처음에 arr.index(i) + index 가 len(arr) -1 보다 클 경우 - len(arr)를 한 번만 빼는 조건만을 적고 제출했는데

 

4개의 테스트케이스에서 런타임에러가 발생했다.

 

나와 같은 방식으로 푸시는 분들도 아마 동일한 에러가 발생했을 텐데,  

 

그 이유는 arr.index(i) + index - len(arr)를 해줘도 len(arr)보다 클 경우가 존재하기 때문이다.

 

(결론부터 말하자면, 이럴 경우에는 len(arr)를 두 번 빼줘야한다.)

 

예를 들어 skip에 들어있는 원소가 10개, index가 20이라고 가정한다. 이때, 제일 끝에 위치한 원소를 찾아야한다면

 

a-z(26)에서 skip 문자열을 빼준 길이가 16이다. 

 

arr.index[끝원소] = 15

index = 20

len(list) = 16

 

15 + 20 - 16 = 19이므로 list의 길이보다 또다시 크기 때문에 len(list)를 한 번 더 빼줘야한다.

 

 

3. 메모

문제를 풀 때, 조건을 잘 고려하는 버릇을 가져야겠다. 

댓글