본문 바로가기
코딩 테스트 연습

[알고리즘] 프로그래머스 - 둘만의 암호

by 코드뭉치 2023. 5. 3.

둘만의 암호

 

alpha = [ord(i) for i in s]
  # 처음 문자열(s)를 아스키 코드로 변환한 문자열들의 리스트
 
index_board = [i for i in range(97, 123)]
  # 문자열의 아스키 코드 범위
 
skip_list = [ord(i) for i in skip]
  # 스킵할 문자열(skip)을 아스키 코드로 변환한 문자열들의 리스트

 index_board 에서 skip_list 의 원소들을 삭제 후


 alpha 의 각각의 원소들을 index_board 에서 찾아서 원래 인덱스 + index만큼 해준 뒤 새로운 리스트에 추가
 
 이때 만약 index_board 의 범위를 넘어갈 경우 IndexError가 발생할 것이므로
 
 try - except를 사용해서 해당 경우에 index_board 의 길이만큼을 추가로 빼주었는데, 
 
 그럼에도 불구하고 index의 크기가 너무 커서 z 에서 a로 두번이상 갈 경우 역시 IndexError가 발생.
 
 조건문을 사용해서 index가 index_board 의 길이보다 클 경우, index를 index % len(index_board)로 값을 변경해주었다.

 

def solution(s, skip, index):
    alpha = [ord(i) for i in s]
    index_board = [i for i in range(97, 123)]
    skip_list = [ord(i) for i in skip]
    for i in skip_list:
        if i in index_board:
            index_board.remove(i)

    answer = []
    result = ""

    for i in alpha:
        if index > len(index_board):
            index = index % len(index_board)
        a = index_board.index(i) 
        try: 
            answer.append(index_board[a + index])
        except:
            answer.append(index_board[a + index - len(index_board)])
    for i in answer:
        result += chr(i) 
    return result

 

 

 

아스키 코드 변환을 먼저 하면, 각각의 변환된 값들을 새로운 리스트에 할당해주어야 해서 코드 가독성이 떨어지고,

 

문제가 발생했을 때, 어디가 문제인지 파악하기 어려웠다. 

 

문자열 그대로 풀이하는 방법 (매커니즘은 동일)

import string
def solution(s, skip, index):
    alpha = string.ascii_lowercase
    for i in skip:
        alpha = alpha.replace(i, "")
    result = ''
    for j in s:
        a = alpha.index(j)
        try:
            result += alpha[a + index]
        except:
            result += alpha[a + index - len(alpha)]
    return result

 

댓글