여름의 서재

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

알고리즘/프로그래머스

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

엉아_ 2021. 11. 7. 02:46
728x90

📕 문제

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

 

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

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

programmers.co.kr

 

💡 풀이법

1. 문자열을 압축할 길이를 1부터 문자열길이//2까지 설정하고 압축해서 최소 길이를 구한다.

( 압출할 길이가 문자열 길이//2보다 커지면 압축 못함)

2. 처음 압축할 길이만큼의 문자열을 s에서 슬라이싱해서 temp에 넣는다. 그리고 압축한 결과물을 담을 new 변수를 반만든다. cnt는 압축할 문자열의 개수이다.

3. 그 뒤의 문자열을 압축할 길이만큼 잘라서 만약 temp와 같다면 cnt를 1 증가시키고, 다르면 cnt가 1일때는 temp를 그대로 new에 추가하고 cnt가 1이 아니라면 cnt와 temp를 new에 추가한다. 그리고 temp는 지금 인덱스부터 압축할 문자열 길이까지 슬라이싱한 문자열로 바꾸고, cnt도 다시 1로 초기화시킨다.

4. for문이 끝나도 마지막 문자열이 안들어간 상황이기 때문에 한번더 new에 추가해주어야한다.

5. 그다음 answer와 new의 길이를 비교해서 더작은것을 answer에 저장한다.

 

def solution(s):
    answer = 1000
    if len(s) == 1:
        return 1

    for n in range(1, len(s)//2+1):
        new = ''
        temp = s[:n]
        cnt = 1
        for i in range(n, len(s), n):
            if temp == s[i:i+n]:
                cnt += 1
            else:
                if cnt == 1:
                    new += temp
                else:
                    new += str(cnt) + temp
                temp = s[i:i+n]
                cnt = 1
        
        if cnt == 1:
            new += temp
        else:
            new += str(cnt) + temp
            
        answer = min(answer, len(new))

    return answer
Comments