문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17684
문제 설명
어치피는 LZW 압축을 구현하기로 했다. LZW 압축은 다음 과정을 거친다.
- 길이가 1인 모든 단어를 포함하도록 사전을 초기화한다.
- 사전에서 현재 입력과 일치하는 가장 긴 문자열 w를 찾는다.
- w에 해당하는 사전의 색인 번호를 출력하고, 입력에서 w를 제거한다.
- 입력에서 처리되지 않은 다음 글자가 남아있다면 (c), w + c 에 해당하는 단어를 사전에 등록한다.
- 단계 2로 돌아간다.
압축 알고리즘이 영문 대문자만 처리한다고 할 때, 사전은 다음과 같이 초기화 된다.
색인 번호 | 1 | 2 | 3 | ... | 24 | 25 | 26 |
단어 | A | B | C | ... | X | Y | Z |
예를 들어 KAKAO가 들어온다고 하자.
- 현재 사전에는 KAKAO의 첫 글자 K는 등록되어 있으나, 두 번째 글자까인 KA는 없으므로, 첫 글자 K에 해당하는 색인 번호 11을 출력하고, 다음 글자인 A를 포함한 KA를 사전에 27 번째로 등록한다.
- 두 번째 글자 A는 사전에 있으나, 세 번째 글자까지인 AK는 사전에 없으므로, A의 색인 번호 1을 출력하고, AK를 사전에 28 번째로 등록한다.
- 세 번째 글자에서 시작하는 KA가 사전에 있으므로, KA에 해당하는 색인 번호 27을 출력하고, 다음 글자 O를 포함한 KAO를 29번 째로 등록한다.
- 마지막으로 처리되지 않은 글자 O에 해당하는 색인 번호 15를 출력한다.
현재 입력(w) | 다음 글자(c) | 출력 | 사전 추가(w + c) |
K | A | 11 | 27: KA |
A | K | 1 | 28: AK |
KA | O | 27 | 29: KAO |
O | 15 |
이 과정을 거쳐 다섯 글자의 문장 KAKAO가 4개의 색인 번호 [11, 1, 27, 15]로 압축된다.
입력 형식
입력으로 영문 대문자로만 이뤄진 문자열 msg가 주어진다. msg의 길이는 1 글자 이상, 1000 글자 이하이다.
출력 형식
주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력하라.
✅ Code - 성공
def solution(msg):
answer = []
eng = {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 10,
'K': 11, 'L': 12, 'M': 13, 'N': 14, 'O': 15, 'P': 16, 'Q': 17, 'R': 18, 'S': 19,
'T': 20, 'U': 21, 'V': 22, 'W': 23, 'X': 24, 'Y': 25, 'Z': 26}
def check_eng(cnt, tmp, max_num):
while msg:
if tmp in eng:
cnt = eng[tmp]
msg.pop(0)
# 위에서 msg를 pop할 경우, msg가 없을 수도 있기 때문에 체크
if msg:
tmp += msg[0]
else:
break
else:
eng[tmp] = max_num
break
return cnt
max_num = 27 # eng 객체의 최대 색인 번호 값
msg = list(msg)
while msg:
cnt, tmp = 0, msg[0]
output = check_eng(cnt, tmp, max_num)
max_num += 1
answer.append(output)
return answer
'알고리즘 문제 > 프로그래머스_Lv2 도장깨기' 카테고리의 다른 글
[프로그래머스] n진수 게임 (2) | 2024.02.28 |
---|---|
[프로그래머스] 파일명 정렬 (Python) (0) | 2024.02.26 |
[프로그래머스] 방금그곡 (Python) (1) | 2024.01.23 |
[프로그래머스] 캐시 (Python) (0) | 2024.01.22 |
[프로그래머스] 뉴스 클러스터링 (Python) (0) | 2024.01.19 |