이제는 사용하지 않는 공부방/Algorithm

[완전탐색,파이썬] 문자열 압축 4/16

환상상상속상 2021. 4. 16. 12:39

# 문자열 압축 4/16

## 목적: 문자열을 단위를 기준으로 압축한다

## 아이디어: 문자열을 받고 단위를 1 ~ n으로 변화시키면서 압축을 하고 결과를 비교하여 가장 최소의 길이를 출력한다.

## 문제분류: 길이가 작기때문에 완전탐색문제다.

## step 부분을 어떻게 해야할지 곤란했다.

## 1) 1 부터 최대 길이가 아닌 중간 길이 즉, n/2까지만 고려하면 됐다.
## 2) for j in range(step, len(s), step)  prev == s[j: j + step] 이렇게 하면 스텝만큼 커지니깐 비교가 가능하다

 

s = input()

n = 0

for step in range(1, len(s) + 1):
    # *(1포인트)
    result = ""
    for i in range(0,len(s),step):
        # *(2포인트)
        if s[i: i + step] == s[i + step: i + 2*step]:
            n+=1
        else:
            if n != 1:
                result += str(n) + s[i: i + step]
            if n == 1:
                result += s[i: i + step]
            n = 0
            
    print(result)
            
    
# if same:
#         n += 1
#     else:
#         n + 반복문자
#         n = 0
        

 

def solution(s):
    answer = len(s)
    
    #압축 단위를 늘려간다.
    for step in range(1, len(s) // 2 + 1):
        compressed = ""
        #앞에서부터 step만큼의 문자열 추출
        prev = s[0: step]
        count = 1
        
        #step만큼 증가시키며 이전 문자열과 비교
        for j in range(step, len(s), step):
            if prev == s[j : j + step]:
                count += 1
            else:
                compressed += str(count) + prev if count >= 2 else prev
                prev = s[j : j + step]
                count = 1
        compressed += str(count) + prev if count >= 2 else prev
        answer = min(answer, len(compressed))
        
    return answer