이숭간 공부기록

[프로그래머스] 파이썬 _ 압축 ( 카카오 2018 ) 본문

알고리즘/프로그래머스

[프로그래머스] 파이썬 _ 압축 ( 카카오 2018 )

이숭간 2021. 8. 20. 02:28
728x90

https://programmers.co.kr/learn/courses/30/lessons/17684

 

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

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

programmers.co.kr

문제유형 : 문자열, 구현

 

문제풀이 :

  • 문자열가지고 주어진 문제조건대로 구현하라는 카카오스러운 문제다.
  • 하라는대로 하면 되긴하는데 while문 조건에서 마지막 빠져나오는 부분에서 조금 헷갈려서 ide디버깅기능을 사용해서 풀긴햇다,,
  •     # 가장 길면서 사전에 존재하는 문자열을 찾는다. (while문 이용)
        # 해당 문자열을 키로하는 값을 answer배열에 기록한다.
        # 문자열에 다음문자 하나 더한것을 사전에 더한다.
        # 문자열을 줄인다.
        # 위 과정을 반복한다. 문자열이 없어질때까지

 

정답코드 :

def solution(msg):
    answer = []

    dic = {chr(i + 64): i for i in range(1, 27)}
    end_val = 26
    # 가장 길면서 존재하는 문자열을 찾는다.
    # 해당 문자열을 키로하는 값을 출력한다.
    # 문자열에 다음문자 하나 더한것을 사전에 더한다.
    # 문자열을 삭제한다.
    # 위 과정을 반복한다. 문자열이 없어질때까지
    return s(msg, dic, end_val)


def s(msg, dic, end_val):
    answer = []
    msg = list(msg)
    while len(msg) > 1:
        i = 1
        curr = ''
        while True:
            s = ''.join(msg[:i])
            # 현재값이 사전에 있다면 저장한후에 한번더 늘려서 확인한다.
            if s in dic:
                curr = s # 현재까지 최대길이 문자
                i += 1
                # 이부분이 없으면 무한로딩이된다. 인덱싱은 i가 msg길이가 넘어가도 에러가 안남
                # 즉 남은 문자열 사전에 등록된 문자이면서 더이상 추가할 문자가 없으면 바로 끝내야한다.
                if i > len(msg): 
                    answer.append(dic[curr])
                    return answer
                    
            # 더이상 없다면 
            else:
                next_key = s
                i -= 1
                break
        # 사전에 존재하면서 가장 긴 문자열을 찾았다. = curr
        answer.append(dic[curr])
        # 사전에 새로 추가할 키값 
        end_val += 1
        dic[next_key] = end_val
        msg = msg[i:]
    else:
        answer.append(dic[msg[0]])

    return answer