문자열 압축 파이썬

임규성·2022년 11월 8일
0
post-custom-banner

문제

링크

2시간 동안 고민하고 해결방법 모색하고 결국 구현까지 해봤던 코드이지만 결국 풀리지 않았다.
너무 마음이 아프다.

def solution(s):
    answer = 10000
    length = len(s)
    for i in range(1, length // 2 + 1):
        result = 0
        
        #두번째 반복문의 루프제어변수 j
        j = 0
        while j + i <= length:
            
            #반복횟수 계산
            repeat = s[j: j+i]
            count = 0
            while j + i*(count + 2) <= length:
                if(repeat == s[j + i*(count + 1): j + i*(count + 2)]):
                    count += 1
                    end = j + i*(count + 2)
                else:
                    break
            
            #반복횟수가 0일때 == 반복 안할 때   
            if(count == 0):
                result += i
                j += i
            #반복횟수가 0보다 클 때
            else:
                #count의 자릿수 구하기
                tmp = 1
                while count >= 10:
                    count = count // 10
                    tmp += 1
                result += tmp
                result += i
                j = end
        
        if(j < length):
            tmp = length - j 
            result += tmp
            
        answer = min(answer, result)    
        
    return answer

왜 틀렸나 봤더니 문제를 잘못읽었다.
이문제를 정독했을 때 몰랏던 점이 테스트케이스 5를 보고 알 수 있었다.
테스트 케이스5를 가져와 보면
x / ababcdcd / ababcdcd 이렇게 나누는게 불가능 하다는 것이고
무조건 압축단위 크기인 K에 맞춰서 딱딱 압축만 가능 하다는 것이다.
그래서 사실상 더 쉬운 문제를 문제를 잘 못읽어 어렵게 풀고 잇었다ㅜㅡㅜ

다시 문제를 풀어봤다!

구현하는데는 20분이 걸렸지만 최종적으로 걸린시간은 두둥탁!

디테일적인 작은요소가 안보여서 계속 삽질했다.
여기서 느낀점은 코드만 보는것보다 직접 출력해봐서 눈으로 확인해보는게 디테일한 실수를 잡는데 도움이 되었다.

정확히는

while j + i*(count + 2) <= length:
                if(repeat == s[j + i*(count + 1): j + i*(count + 2)]):
                    count += 1
                    end = j + i*(count + 2)

end를 마지막에 지정해줄 때 count가 +=1 연산 되는 부분을 생각치 못하고 end지점을 지정했다.
(정말 초보적인 실수이다.)
참 힘들게 풀었다 정말!!!!!

profile
삶의 질을 높여주는 개발자
post-custom-banner

0개의 댓글