알고리즘/프로그래머스

[프로그래머스 | Lv2] 문자열 압축 (Python) - 2020 KAKAO BLIND RECRUITMENT

sssbin 2023. 3. 8. 14:19

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문자열 길이의 절반보다 큰 수로 문자열을 자르면 문자열 압축이 불가능하기 때문에

1부터 문자열 길이의 절반만 탐색한다. ==> 압축하는 문자열의 길이

(처음에 len(s)//2+1로 범위를 잡아줬다가 tc5에서 실패했다. 문자열의 길이가 1일 경우를 고려하여 +2를 해준다.)

 

cnt(같은 문자열의 개수), result(압축된 문자열), temp(비교 문자열) 변수를 뒀다.

i(압축하는 문자열의 길이)번째 문자부터 문자열을 탐색하는데, 인덱스는 i씩 증가한다.

temp와 현재 문자열을 비교하여 같으면 cnt를 증가시키고,

다르면 저장되어 있는 cnt와 temp를 result 문자열에 붙여주고 두 값을 현재의 값으로 갱신한다.

 

문자열 압축할 때 인덱스의 범위를 지정해뒀기 때문에 모든 탐색을 종료한 후 끝에 문자열이 남아있을 수 있다.

그래서 마지막으로 남은 문자열을 모두 붙인 후 문자열 길이의 최솟값을 갱신한다.

 

# 프로그래머스 60057: 문자열 압축 (2020 KAKAO BLIND RECRUITMENT)

def solution(s):
    answer = 1000 # s의 최대 길이

    # 문자열의 길이의 절반만 탐색 (문자열의 길이가 1일 경우를 고려하여 +2)
    for i in range(1, len(s)//2+2):
        cnt = 1
        result = ''
        temp = ''

        # 문자열 압축
        for j in range(i, len(s)+1, i):
            if s[j-i:j] == temp:
                cnt += 1
            else:
                if cnt < 2:
                    result += temp
                else:
                    result += str(cnt) + temp
                cnt = 1
                temp = s[j-i:j]

        # 남은 문자열 전부 붙이기
        if cnt < 2:
            result += temp + s[j:]
        else:
            result += str(cnt) + temp + s[j:]

        # 최솟값 갱신
        answer = min(answer, len(result))

    return answer

 

설명하는 건 어려워..💧