문자열 압축

메캉·2022년 7월 17일
0

알고리즘 👑

목록 보기
4/11

URL

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

개선할 점

  1. 일단 1인 경우 replace를 한다는 컨셉은 좋았으나, 10, 110과 같은 수를 간과함
  2. 실제 문자열을 출력하지 않고, max 길이를 아니까 max 길이에서 압축되면 중복 (count - 1) * (문자열길이) 값을 빼주는 식으로 코드 진행 가능
  3. range 나 slice의 경우 [m,n] 이라면 m은 포함, n은 불포함

내 코드

def slicing(s, k):
    i = 0
    sliced = []
    while i < len(s):
        ss = ''.join(s[i:i+k])
        sliced.append(ss)
        i += k
    return sliced

def calc(i, arr):
    res = ''
    cnt = 1
    while i < len(arr):
        if arr[i] == arr[i-1]:
            cnt += 1
        else:
            count = '' if cnt==1 else str(cnt)
            res += count + arr[i-1]
            cnt = 1
        i += 1
    count = '' if cnt==1 else str(cnt)
    res += count + arr[-1]
    #10 이상인 경우...
    return len(res)
def solution(s):
    s = list(s)
    answer = len(s)
    for i in range(len(s)):
        arr = slicing(s, i+1)
        str_len = calc(1, arr)
        if str_len < answer:
            answer = str_len
    
    return answer

가이드 코드

def compress(text, tok_len):
    words = [text[i:i+tok_len] for i in range(0, len(text), tok_len)]
    res = []
    cur_word = words[0]
    cur_cnt = 1
    for a, b in zip(words, words[1:] + ['']):
        if a == b:
            cur_cnt += 1
        else:
            res.append([cur_word, cur_cnt])
            cur_word = b
            cur_cnt = 1
    return sum(len(word) + (len(str(cnt)) if cnt > 1 else 0) for word, cnt in res)

def solution(text):
    return min(compress(text, tok_len) for tok_len in list(range(1, int(len(text)/2) + 1)) + [len(text)])

a = [
    "aabbaccc",
    "ababcdcdababcdcd",
    "abcabcdede",
    "abcabcabcabcdededededede",
    "xababcdcdababcdcd",

    'aaaaaa',
]

for x in a:
    print(solution(x))

0개의 댓글