[프로그래머스 lv2] 압축 Python

2018 KAKAO BLIND RECRUITMENT문제이다.
메뉴얼만 잘 따라가면 쉽게 풀 수 있었던 문제.
하지만 문자열 인덱싱 부분에서 살짝 헷갈리는 부분이 있어서 고찰겸 글을 써본다

밑은 작성해서 통과한 코드이다.


def solution(msg):
    answer = []
    dic = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26}

    while msg!="":
        for i in range(len(msg)):
            if msg[:len(msg)-i] in dic.keys():
                w=msg[:len(msg)-i]
                answer.append(dic[w])
                msg=msg[len(msg)-i:]
                c=msg[0:1]
                dic[w+c]=max(dic.values())+1
                break


    return answer

문제의 메뉴얼에서
3. w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
4. 입력에서 처리되지 않은 다음 글자가 남아있다면(c), w+c에 해당하는 단어를 사전에 등록한다.

부분에서 c를 저장할 때

msg=msg[len(msg)-i:]
c=msg[0:1]

문자열을 제거하는 과정을 문자열 슬라이싱을 하고
슬라이싱한 문자열의 첫번째 글자를 c에 저장하는 방식으로 구현을 했다.
하지만 여기서 만약

msg=msg[len(msg)-i:]
c=msg[0]

이런식으로 바꾸면

이렇게 인덱싱 에러가 난다.

원인은 msg가 "" 일때
1. msg[0] 은 읽을 것이 없어서 out of index 에러를 낸다
2. msg[0:1] 같은 슬라이싱은 인덱스에 아무 값이 없어도 빈 문자열을 반환해준다. => 조금 더 개념을 확장해보면 인덱스가 있는 곳의 값은 반환해주고 없으면 NULL을 반환해준다.

이러한 효과는 python의 공식 문서에서도 찾아볼 수 있다.

출처: https://docs.python.org/3.10/tutorial/introduction.html#strings

좋은 웹페이지 즐겨찾기