코딩테스트

문자열 압축

서창호 2022. 1. 24. 20:30

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

 

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

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

programmers.co.kr

부끄럽게도 min_length를 별 생각없이 9999로 지정하여 문제를 풀었다가, 길이가 1인 문자열이 들어온 경우 for loop을 돌지 않아 9999가 min_length로 반환되는 일이 발생했다...

for loop과 초기화는 항상 빈틈없게...

def solution(s):
    answer = ""
    min_length = len(s)
    
    for unit in range(1,len(s)//2+1):
        splitted = []
        compressed = ""
        for i in range(0,len(s),unit):
            splitted.append(s[i:i+unit])
        
        head = splitted[0]
        cnt = 1
        for cur in splitted[1:]:
            if cur == head:
                cnt+=1
            else:
                if cnt != 1:
                    compressed = compressed + str(cnt)
                compressed = compressed + head
                cnt = 1
                head = cur
        if cnt != 1:
            compressed = compressed + str(cnt)
        compressed = compressed + cur
        
        if len(compressed) < min_length:
            min_length = len(compressed)

    return min_length

문자열을 1개씩 ~ 문자열 길이 절반 개수씩 쪼개가면서 가장 짧게 압축되는 경우를 찾는다.

split을 완료하고 나면 head에는 가장 앞의 쪼갠 문자열을 대입하고, 그 다음 문자열 조각부터 for loop을 수행한다.

이 때, head와 cur가 같으면 압축이 가능하다는 의미이므로 cnt를 1 증가시키고 넘어간다.

head와 cur가 같지 않은 경우, head는 더이상 압축이 불가능하다는 뜻으로, 두 개 이상 중복된 경우 카운트 횟수를 압축된 문자열에 출력한 뒤, head를 출력하고, head를 현재의 cur로 변경시킨다.

 

for loop을 다 돌고 나면, 마지막 head에 대한 나머지 처리를 해준다. 

 

min_length보다 압축한 문자열의 길이가 더 작은 경우, min_length를 갱신한다.

 

쓸데없는 실수로 멘붕해서 쉬운문제에서 시간뺏기는 일이 없도록 해야겠다.