본문 바로가기
알고리즘/프로그래머스

[Python] 문자열 압축

by 컴공맨 2021. 3. 14.
 

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

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

programmers.co.kr


풀이

우선 문자열이 한개만 올 수 있으므로 해당 경우를 처리했습니다.

다음으로, 문자열을 1개부터 최대로 자를 수 있는 개수인 len(s) / 2 만큼까지 각각 일정하게 잘라 리스트에 저장했습니다.

그 다음 반복문을 통해  리스트의 인덱스를 사용해서 이전의 값과 같다면 압축을 할 수 있으므로 cnt를 +1 시켜주었습니다.

그리고 만약 다를경우 cnt가 1이라면 이전의 자른 문자가 한 번만 나온것이므로 그대로 압축문자열에 저장해주고 1보다 클 경우에는 압축이 가능하므로 cnt를 문자열로 변환시켜 이전 문자앞에 추가하여 압축문자열에 저장했습니다.

이때, 현재 인덱스는 이전까지와 다른 문자열이므로 이전 문자열을 압축문자열에 저장하고 현재 문자열은 처음 나온 것 이므로 cnt를 1로 초기화를 했습니다.

마지막으로 반복문을 사용할경우 마지막 자른 문자열은 압축문자열에 추가가 안되므로 직접 처리해주고 길이가 가장 짧은 압축문자열을 구해 해결했습니다.


코드

def solution(s):
    answer = 987654321
    
    # 문자열이 한개일 수 있다
    if len(s) == 1:
        return 1

    max_zip_len = len(s) // 2
    str_len = len(s)

    for i in range(1, max_zip_len + 1):
        zip_str_list = [s[j:j + i] for j in range(0, str_len, i)]

        cnt = 1
        zip_result = ""
        zip_str_list_len = len(zip_str_list)
        for idx in range(1, zip_str_list_len):
            if zip_str_list[idx - 1] == zip_str_list[idx]:
                cnt += 1
            else:
                if cnt > 1:
                    zip_result += str(cnt)
                zip_result += zip_str_list[idx - 1]
                cnt = 1

        if cnt > 1:
            zip_result += str(cnt)
        zip_result += zip_str_list[zip_str_list_len - 1]

        answer = min(answer, len(zip_result))

    return answer

 

pyo7410/Algorithm

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[Python] 괄호 변환  (0) 2021.03.21
[Python] 메뉴 리뉴얼  (0) 2021.03.15
[Python] 다트 게임  (0) 2021.03.07
[Python] 실패율  (0) 2021.03.06
[Python] 비밀지도  (0) 2021.02.28