Algorithm/프로그래머스

[프로그래머스/Python] 문자열 압축

poppy 2021. 5. 14. 12:47
반응형

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

 

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

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

programmers.co.kr

def solution(s):
    answer = len(s) # 최소 길이
    
    # 자르는 단위 늘려가며 최소 길이 계산
    for slice in range(1, len(s)//2+1):
        result = "" # 압축된 문자열
        count = 1 # 반복되는 횟수
        compare = s[0:slice] # 자른 문자열
        
        # 압축된 문자열 구하기
        for i in range(slice, len(s), slice):
            # 문자열이 반복되는 경우
            if compare == s[i: i+slice]:
                count += 1
            # 더 이상 압축할 수 없는 경우
            else:
                if count == 1: 
                    result += compare
                    compare = s[i: i+slice]
                else: 
                    result += (str(count) + compare)
                    count = 1
                    compare = s[i: i+slice]
        
        # 나머지 문자열 처리
        if count == 1: result += compare
        else: result += (str(count) + compare)
            
        answer = min(answer, len(result)) # 최소 길이 계산
    
    return answer

이 문제는 for문과 if문이 많아서 뭔가 되게 복잡하게 느껴지는 문제였습니다. 하나씩 차근차근 풀어나가는 것이 중요한 것 같습니다. 

 

먼저 자르는 단위를 늘려가면서 최소 길이를 구하기 위해 for문을 사용합니다. 자르는 단위가 문자열 길이를 넘기면 안되니까 for문은 1부터 len(n)//2까지 반복하도록 합니다. 문자열을 앞 뒤로 비교하기 위해 compare에 문자열을 잘라 저장합니다.

압축된 문자열을 구하기 위해 for문을 하나 더 사용합니다. compare의 다음 문자열부터 비교해야하므로 for문을 자른시점부터 문자열 끝까지 자른 단위 간격으로 반복합니다. 여기서 compare과 다음 자른 문자열이 같다면 count에 1를 더해줍니다. 문자열이 반복될 때마다 count값을 증가시켜 반복된 횟수를 구합니다. 이제 더 이상 문자열이 반복되지 않고 압축할 수 없는 경우에는 count 값에 따라 처리가 달라집니다. count 가 1일 경우 result에 compare 값을 더해주고 다음 문자열로 넘어가 반복되는지 확인하기 위해 compare은 다음 문자열로 초기화해줍니다. count가 1이 아닐 경우에는 반복된 횟수(str(count))와 compare를 result에 저장하고 compare과 count 모두 초기화 해줍니다.

for문이 다 끝나도 처리되지 않은 나머지 문자열을 처리해줍니다. 마지막으로 answer와 압축된 문자열 result 중 최소 길이를 구해 answer에  저장합니다.

반응형