본문 바로가기
algorithm/programmers

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

by hoonzii 2021. 11. 14.
반응형

코드

def solution(s):
    answer = len(s)
    
    for n in range(1, len(s)//2+1):
        count = 1
        temp_sentence = ""
        for index in range(0, len(s), n):
            prev_s = s[index:index+n]
            next_s = s[index+n:index+(2*n)]
            if prev_s == next_s:
                count+=1
            else:
                if count != 1:
                    temp_sentence += str(count)+prev_s
                else:
                    temp_sentence += prev_s
                count = 1
        # print(temp_sentence, len(temp_sentence))
        if answer > len(temp_sentence):
            answer = len(temp_sentence)
    
    return answer

 

문제 풀이

아 문제를 풀고나니 왤케 어렵게 생각하고 실제로도 고민을 했는지 스스로가 한심쓰...

우선 첫번째 반복문의 경우 "몇개씩 볼건지" 에 대한 숫자 n을 설정한다. 최대 압축률은 문자길의 반이기 때문에

len(s)//2 까지로

 

두번째 반복문은 그래서 실제로 문자열을 보는 걸 의미라고

prev = s[index:index+n] / next = s[index+n:index+(2*n)] 을 통해 앞 문자열(prev) 과 뒤 문자열(next)를 비교한다.

 

만약 두 문자열이 같다면 count를 올려준다.

(이 부분에서 애를 먹었었다. n=1 일때 ccc의 경우 2c+c 가 아니라 3c 라고 줄이는 걸 변경하는데 시간을 썼다.)

 

만약 두 문자열이 다르다면 str(count) + prev를 변경되는 문자열(temp_sentence)에 추가해주고 count는 다시 원복해준다.

 

변경되는 문자열(temp_sentence)의 길이가 원래 문자열(s)보다 짧다면 해당 길이를 기준으로 변경해준다.

n의 크기를 반복하며 가장 짧게 변하는 문자열의 길이를 찾는다.

끝!

 

 

문제는 여기

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

 

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

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

programmers.co.kr

 

반응형

댓글