chyam

[프로그래머스 Lv2,python]- 압축 본문

프로그래머스/LV2

[프로그래머스 Lv2,python]- 압축

chyam_eun 2025. 1. 22. 11:47

https://school.programmers.co.kr/learn/courses/30/lessons/17684?language=python3

def solution(msg):
    li=[] # 알파벳 값들 저장하는곳
    for i in range(65,91): # A~Z까지 저장하기
        li.append(chr(i)) # 아스키코드
    an = [] # 출력할 값의 인덱스들
    i=0 # 인덱스
    while(i<len(msg)):
        j=2 # 인덱스 범위에 더할 값
        k=1 # 인덱스를 증가시킬 값
        le=len(li) # 원래 길이 저장
        while(i+j<=len(msg)): # 인덱스가 msg길이 이하여야함
            if msg[i:i+j] not in li: # 값이 li에 없으면 
                li.append(msg[i:i+j]) # 추가해주기
                break
            j+=1 # 비교할 범위 증가시키기
            k+=1 # 인덱스 증가시키기
        if le==len(li): # 길이가 같다는건 추가되지 않은것이므로 그 알파벳의 인덱스+1을 저장하기
            an.append(li.index(msg[i:i+j])+1) 
        else: # 추가된것은 i부터i+j-1까지 li에 있는것이므로 그 알파벳의 인덱스+1을 저장하기
            an.append(li.index(msg[i:i+j-1])+1)
        i+=k 
    return an

위는 내가 작성한 풀이이다. LZW압축을 제대로 사용하지 않아서 조금 복잡하다,,

아래는 다른분의 풀이이다. 

def solution(msg):
    alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    d = {k:v for (k,v) in zip(alphabet, list(range(1,27)))} # "A":1 이런식으로 저장된것
    answer = []

    while True:
        if msg in d: # d에 msg 전체가 있으면
            answer.append(d[msg]) # 그것의 색인번호를 추가해주고 끝내기
            break
        for i in range(1, len(msg)+1): 
            if msg[0:i] not in d: # 0~ i까지의 값이 없으면
                answer.append(d[msg[0:i-1]]) # 그전인덱스까지의 색인번호를 추가해주기
                d[msg[0:i]] = len(d)+1 # d에 색인번호 추가하기
                msg = msg[i-1:] # msg를 잘라서 저장해주기
                break
    return answer