알고리즘

[프로그래머스] 문자열 압축 (파이썬)

김해리 2022. 4. 16. 10:00

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

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr


​길이별로 문자열의 압축을 진행하고 그 결과의 길이를 비교하여 최솟값을 반환합니다.

  • solution
    • 길이가 1 인 경우, 아무 작업도 수행하지 않고 문자열을 그대로 반환합니다
    • 길이가 2 이상인 경우, 1부터 "문자열의 길이-1"까지 숫자를 증가시키며 문자열 압축을 시도하고 최솟값을 반환합니다
  • compress
    • 문자열을 특정한 길이로 압축합니다
      • 문자열을 일정한 길이로 잘라 chunks에 넣어줍니다
      • 압축결과를 담을 비어있는 리스트 compressed 를 준비합니다
      • 각 문자덩어리 chunks[i] 를 다음 문자덩어리 chunks[i+1] 와 확인합니다
        • 두 문자덩어리가 같다면 cnt를 1 증가시킵니다
        • 다르다면 더이상 압축을 진행할 수 없습니다
          • cnt가 2 이상이라면 결과에 cnt를 추가합니다 (cnt가 1이라면 결과에 cnt를 추가하지 않습니다)
          • 현재 문자덩어리 chunks[i] 를 결과 compressed 에 추가하고 cnt를 1로 초기화합니다 (해당 문자덩어리를 사용한 압축이 종료되었습니다)
      • 앞선 반복문에서 처리하지 못한 가장 마지막 문자덩어리 chunks[i+1] 를 처리합니다
        • cnt가 2 이상이라면 결과에 cnt를 추가합니다
        • 가장 마지막 문자덩어리 chunks[i+1] 를 결과에 추가합니다
      • 압축결과를 문자열로 변환하고 길이를 반환합니다

 

def solution(s):
    if len(s) < 2:
        ans = len(s)
    else:
        ans = min([compress(s, x) for x in range(1, len(s))])
    return ans


def compress(s, num):
    chunks = [s[x : x + num] for x in range(0, len(s), num)]
    cnt = 1
    compressed = []
    for i in range(len(chunks) - 1):
        if chunks[i] == chunks[i + 1]:
            cnt += 1
        else:
            if cnt > 1:
                compressed.append(str(cnt))
            compressed.append(chunks[i])
            cnt = 1
    if cnt > 1:
        compressed.append(str(cnt))
    compressed.append(chunks[i + 1])
    return len("".join(compressed))

 

반응형