코딩테스트/[PG] 문제 풀이

[프로그래머스] 2020 KAKAO - 문자열 압축

_JAEJAE_ 2021. 9. 4. 19:15

https://programmers.co.kr/learn/courses/30/lessons/60057?language=python3 

 

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

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

programmers.co.kr


[풀이 과정]

1. 입력으로 들어온 문자열의 길이가 1이라면 1을 return한다.

 

2. 문자열의 길이가 1이 아니라면 반복문을 실행한다.

- i는 1~len(s)//2까지이며 나누려는 문자열의 길이이다.

- arr에는 나눈 문자열을 담고, count는 반복된 개수, total을 압축 후 문자열 전체 길이를 담을 변수이다.

- j는 전체 문자열을 i길이만큼 나눌 때 사용한다. 

- 현재 arr에 아무 값이 없다면 i길이만큼 나눈 문자열을 넣고 count에 1을 추가한다.

- arr에 값이 있을 때 다음 i길이 문자열이 arr와 같다면 count의 마지막 값을 1 증가시킨다.

  이때 i+j가 len(s)보다 길다면 현재 문자열 조각이 마지막 조각이므로 그 길이만큼 total에 추가한다.

- arr에 값이 있을 때 다음 i길이 문자열이 arr와 같지 않다면 total에 arr길이만큼 추가하고 arr를 새로운

  문자열 조각으로 업데이트 후 count에도 1 추가한다.

  이때도 i+j가 len(s)보다 길다면 현재 문자열 조각이 마지막 조각이므로 그 길이만큼 total에 추가한다.

 

3. count 리스트에서 한 값씩 꺼내면서 1인 경우엔 출력할 필요가 없으므로 넘기고 1이 아닐 경우엔 그 값을 문자열로 바꾼 후 그 길이를 total에 더해준다.

ex) c = 14이면 total에 2를 추가하기 위해 len(str(c))을 해준다.

 

4. 모든 길이에 대해 탐색을 끝내면 res에 들어간 값들 중 최소 길이를 answer에 넣고 return한다.


[소스 코드]

def solution(s):
    if len(s) == 1: answer = 1
    else:
        res = []
        for i in range(1, len(s)//2+1):
            arr, count, total = '', [], 0
            for j in range(0, len(s), i):
                if len(arr) == 0: 
                    arr = s[j:j+i]
                    count.append(1)
                else:
                    if arr == s[j:j+i]: 
                        if i+j >= len(s) : total += len(s) - j
                        count[-1] += 1
                    else:
                        if i+j >= len(s) : total += len(s) - j
                        total += len(arr)
                        arr = s[j:j+i]
                        count.append(1)

            for c in count:
                if c == 1: continue
                else: total += len(str(c))

            res.append(total)
        answer = min(res)
                
    return answer