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

thisishwarang·2023년 11월 2일
0
post-thumbnail

프로그래머스로 문제를 풀고 이를 회고하기 위해 글로 써본다

간단한 문제 설명

  1. 문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
  2. index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
  3. skip에 있는 알파벳은 제외하고 건너뜁니다.

문제를 해결하기 위한 아이디어

  1. 먼저 26개의 알파벳을 문자열 혹은 배열에 담아놓고 skip의 문자열 크기만큼 반복문을 사용하여 제거한 새로운 알파벳 문자열 혹은 배열 생성.
  2. s문자열 크기만큼 반복문을 사용하여
    각 문자별 알파벳 배열에서의 인덱스 + 매개변수로 입력받은 index 에 해당하는 문자를 결과값에 추가.
    -> 이때 더한 index값이 배열의 크기보다 커질 수 있음을 생각하기

def solution(s, skip, index):
    result = ''
    alphabet = "abcdefghijklmnopqrstuvwxyz"
    remaining_alphabet = [c for c in alphabet if c not in skip]
    # alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
    # for skip_a in skip :
    #     alphabet.remove(skip_a) 
    
    for sa in s :
        if sa in remaining_alphabet :
            index_in_remaining = (remaining_alphabet.index(sa) + index) % len(remaining_alphabet)
            result += remaining_alphabet[index_in_remaining]

        # if alphabet.index(sa) + index < len(alphabet) :
        #     result += alphabet[alphabet.index(sa) + index]
        # else :
        #     result += alphabet[alphabet.index(sa) + index - len(alphabet)]
    return result

위 코드에서 주석처리한 부분은 런타임 에러가 나기 이전에 작성했던 코드이다.
알파벳을 배열에 넣고 remove() 메서드로 skip에 해당하는 문자를 제거했다.

그리고 index값을 더했을 때 alphabet 배열보다 큰지 작은지 비교하여 그에 맞게 분기처리를 해주었다.

하지만 그 코드로 실행을 돌렸을 때 반례가 존재했고 이를 해결하기 위해
s문자열에 있는 각 문자의 index값과 입력받는 index값을 더한 값이 alphabet 배열 길이보다 클 때 len(alphabet)을 빼는것이 아닌 이 값으로 나눈 나머지로 해결하였다.

0개의 댓글