본문 바로가기
Algorithm/Python

[Python] 프로그래머스 - [3차] 압축

by 힘팽 2022. 3. 13.

◈ 오류 정정 및 피드백 환영

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

 


🔎문제 분석

ASCII 코드를 활용하면 사전은 간단하게 구현할 수 있다. A부터 Z는 65부터 90에 해당한다.

dic = dict(zip([chr(i) for i in range(65, 91)],list(range(1,27))))

현재 입력이 2개 이상의 문자열이 될 수 있기 때문에 문장의 글자를 하나씩 인덱싱하면 안 된다.

i = 0
while i<len(msg):
    w = msg[i]

대신 다음과 같이 사전에 없는 글자가 나올 때까지 추가해야 한다.

만약 현재 입력이 사전에 없다면 사전에 추가하고 현재 입력을 빈 문자열로 초기화한다.

i = 0
w = ""
idx = 26
while i<len(msg):
    w += msg[i]
    if w in dic.keys():
        i += 1
    else:
        idx += 1
        dic[w] = idx
        w = ""

 

현재 입력이 사전에 있더라도 무조건 현재 입력의 색인 번호를 출력할 수 있는 것은 아니다. 조건은 다음과 같다.

  • 다음 글자를 인덱싱해야 하므로 현재 입력은 문장의 마지막 글자가 아니어야 한다
  • 현재 입력의 다음 글자까지 포함한 문자열이 사전에 없어야 한다.
if w in dic.keys():
    if i<len(msg)-1:
        if w+msg[i+1] not in dic.keys():
            answer.append(dic.get(w))
    i += 1

🤦‍♀️유의 사항

현재 입력이 문장의 마지막 한 글자일 경우에는 처리되지 않은 다음 글자가 없는 셈이므로 위에서 언급한 조건에서 어긋나 출력을 하지 않게 된다. 따라서 while문이 종료된 이후 별도로 출력해줘야 한다.

while i<len(msg):
    # 생략
answer.append(dic.get(w))

def solution(msg):
    dic = dict(zip([chr(i) for i in range(65, 91)],list(range(1,27))))
    answer = []
    i = 0
    w = ""
    idx = 26
    while i<len(msg):
        w += msg[i]
        if w in dic.keys():
            if i<len(msg)-1:
                if w+msg[i+1] not in dic.keys():
                    answer.append(dic.get(w))
            i += 1
        else:
            idx += 1
            dic[w] = idx
            w = ""
    answer.append(dic.get(w))
    return answer

댓글