2018 KAKAO BLIND RECRUITMENT 압축 파이썬

1 분 소요

2018 KAKAO BLIND RECRUITMENT 압축 파이썬 풀이

이번 문제는 레벨 2입니다.

접근방식(+오류코드)

  1. 문자의 길이가 0이 될 때까지 while 문을 반복합니다.
  2. 앞에서부터 한 자리씩 문자열을 비교하고, 존재한다면 인덱스를 append, 존재하지 않는다면 리스트에 append시킵니다.
  3. 핵심은 일치하는 문자열 중 가장 긴 문자열을 찾아야 하는데 이를 구현하는 것이 어려웠습니다.
  4. 결국, BE를 찾아야 할 순간에, B만을 일치하는 것으로 판단하여 2라는 인덱스를 리턴하게 되는 오류가 생겼습니다.

개인적인 오류 코드를 첨부하지만, 프로그래머스에서 가장 좋아요 개수가 많은 정답코드를 분석하도록 하겠습니다.

내 풀이(오답)

import string

def solution(msg):
    aList = [0] + list(string.ascii_uppercase)
    answer = []

    status = True
    while status:
        if len(msg) == 0:
            status = False
        else:
            max_val = 1
            for i in range(1, len(msg)):
                if msg[0:i] in aList:
                    max_val = max(max_val, i)
                    answer.append(aList.index(msg[0:max_val]))
                    aList.append(msg[0:max_val+1])
                    # print("msg", msg)
                    msg = msg[max_val:]
                    print("max", max_val)
                    print(aList)
                    # print("answer", answer)
                    # print("aList", aList)
                # print("max_val", max_val)
    return answer


print(solution('TOBEORNOTTOBEORTOBEORNOT'))

아래는 모범코드입니다.

모범코드

def solution(msg):
    answer = []
    # 아스키 코드를 활용해서 dict 생성
    tmp = {chr(e + 64): e for e in range(1, 27)}
    # 다음부터 append 될 초기 인덱스 지정
    num = 27
    # msg가 0가 될 때까지 반복
    while msg:
        tt = 1
        # 입력값의 길이를 넘지 않을 때 까지 반복하는 조건문
        while msg[:tt] in tmp.keys() and tt <= msg.__len__():
          # 이 부분을 통해 최대 길이를 찾아낼 수 있습니다.
            tt += 1
          # 만약 key값에 존재하지 않는 것에서 끝난다면 이전 tt 값까지의 인덱스를 append
        tt -= 1
        if msg[:tt] in tmp.keys():
            answer.append(tmp[msg[:tt]])
            # 그냥 append를 하지 않고 key값과 value 값을 따로따로 지정해줍니다.
            tmp[msg[:tt + 1]] = num
            num += 1
        msg = msg[tt:]
    return answer

항상 느끼는 것이지만, 파이썬을 자유롭게 활용한 코드들은 로직이 정말 깔끔한 것 같습니다.

문제에서 주어지는 요구사항을 순차적으로 잘 구현하면 되는 문제들이 많음에도 불구하고,

그 결과물은 상당한 차이를 보입니다.

간결한 로직을 구성하고 그것을 구현할 수 있는 실력을 위해 노력하는 수 밖에 없다고 생각합니다.

알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.

Just do it & Keep steady

댓글남기기