https://school.programmers.co.kr/learn/courses/30/lessons/17684
Solution
def solution(msg):
base = dict()
answer = []
for i in range(1, 27):
base[chr(64+i)] = i
# print(base)
i=0
while True:
if len(msg) <= i:
break
j=2
count = 0
while True:
if len(msg[i:i+j]) != j:
answer.append(base[msg[i:i+j]])
break
elif not msg[i:i+j] in base:
answer.append(base[msg[i:i+j-1]])
base[msg[i:i+j]] = len(base) + 1
break
else:
count += 1
j+=1
i+=1+count
return answer
주어진 문제에서는 LZW 압축 알고리즘을 구현하여 문자열을 압축하는 작업을 수행해야 합니다. LZW 압축은 입력 문자열을 순회하면서 현재 입력과 일치하는 가장 긴 문자열을 찾고, 해당 문자열에 대한 색인 번호를 출력하고 사전에 등록하는 방식으로 진행됩니다. 이를 통해 주어진 문자열을 압축한 후의 사전 색인 번호를 배열로 출력해야 합니다. 입력으로는 영문 대문자로만 이루어진 문자열이 주어지며, 출력은 압축 후의 사전 색인 번호 배열로 주어집니다. 예시로 주어진 입력에 대한 출력은 문제에서 제시된 예시 출력과 일치해야 합니다.
처음에 A부터 Z까지 어떻게 표시할까 하다가 아스키 코드로 변환해주는 ord 함수는 이미 알고있었는데, 그 반대 함수는 몰라서 검색해보았다. chr함수가 그 반대 역할을 한다는 것을 확인, 바로 문제를 푸니까 별 문제 없이 풀 수 있었다.
다른 사람의 풀이
def solution(msg):
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
d = {k:v for (k,v) in zip(alphabet, list(range(1,27)))}
answer = []
while True:
if msg in d:
answer.append(d[msg])
break
for i in range(1, len(msg)+1):
if msg[0:i] not in d:
answer.append(d[msg[0:i-1]])
d[msg[0:i]] = len(d)+1
msg = msg[i-1:]
break
return answer
다른 사람들은 A~Z까지 전부 쓰고 그걸 딕셔너리에 넣는 방법으로 풀었다.
신박하군..
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[heap 정렬에 관하여] 코딩테스트 연습 힙(Heap) 더 맵게 (0) | 2023.07.11 |
---|---|
코딩테스트 연습 2018 KAKAO BLIND RECRUITMENT [3차] n진수 게임 (0) | 2023.07.10 |
코딩테스트 연습 해시 전화번호 목록 (0) | 2023.07.09 |
코딩테스트 연습2018 KAKAO BLIND RECRUITMENT[1차] 뉴스 클러스터링 (0) | 2023.07.08 |
코딩테스트 연습 스택/큐 프로세스 (0) | 2023.07.08 |