프로그래머스/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