2020 카카오 신입 개발자를 위한 코딩 테스트 – 문자열 압축

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

프로그램 제작자

코드 중심 개발자를 고용하십시오. 배치 기반 위치 매칭. 프로그래머의 개발자별 프로필에 가입하고 기술 호환성이 좋은 회사와 연결하십시오.

Programmer.co.kr

1. 실을 자른다

모든 경우에 가장 많이 압축된 문자열의 길이를 반환 -> 모든 경우의 수를 알아내야 하므로 반복문

끈을 자를 때 겹치는 부분이 없기 때문에 n//2 이상의 길이로 나누어도 절반까지만 쪼개진다(끈 자르기).

split_size의 크기만큼 0부터 n까지 반복한다.

2. 중복 문자열 찾기

반복하여 이전 문자열이 현재 문자열과 동일한지 확인

같으면 카운트를 계속 늘리고 다른 순간이 오면 압축이라는 변수에 추가합니다.

count가 1이면 1을 생략하고 더한다.

그리고 루프가 끝나면 마지막에 나머지 꼬리를 추가하십시오.

값 중 가장 낮은 값을 반환하면 확인

def solution(string):
    n = len(string)
    compression_length_array = ()  # 1~len까지 압축했을때 길이 값

    for split_size in range(1, n // 2 + 1): # 1부터 반절까지 쪼개기
        compressed = ""
        # string 갯수 단위로 쪼개기 *
        splited = (string(i:i + split_size) for i in range(0, n, split_size))
        count = 1 # 자기가 이미 있기때문에 1로 시작

        for j in range(1, len(splited)):
            prev, cur = splited(j - 1), splited(j)
            if prev == cur:
                count += 1
            else:  # 이전 문자와 다르다면
                if count > 1:
                    compressed += (str(count) + prev)
                else:  # 문자가 반복되지 않아 한번만 나타난 경우 count 1은 생략함
                    compressed += prev
                count = 1  # 초기화
        if count > 1:
            compressed += (str(count) + splited(-1))  # 꼬다리 부분
        else:  # 문자가 반복되지 않아 한번만 나타난 경우 1은 생략함
            compressed += splited(-1)
        compression_length_array.append(len(compressed))
    return min(compression_length_array)  # 최솟값 리턴

코드 실행 단계에서는 정상적으로 동작하나 평가 단계의 테스트 5에서 문제가 있다.

확인해보니 문자열이 하나뿐인 경우를 고려하지 않아 발생한 오류라 조건문을 추가하여 해결했습니다.

def solution(string):
    n = len(string)
    compression_length_array = ()  # 1~len까지 압축했을때 길이 값
    
    if n == 1:
        return 1
       
    for split_size in range(1, n // 2 + 1): # 1부터 반절까지 쪼개기
        compressed = ""
        # string 갯수 단위로 쪼개기 *
        splited = (string(i:i + split_size) for i in range(0, n, split_size))
        count = 1 # 자기가 이미 있기때문에 1로 시작

        for j in range(1, len(splited)):
            prev, cur = splited(j - 1), splited(j)
            if prev == cur:
                count += 1
            else:  # 이전 문자와 다르다면
                if count > 1:
                    compressed += (str(count) + prev)
                else:  # 문자가 반복되지 않아 한번만 나타난 경우 count 1은 생략함
                    compressed += prev
                count = 1  # 초기화
        if count > 1:
            compressed += (str(count) + splited(-1))  # 꼬다리 부분
        else:  # 문자가 반복되지 않아 한번만 나타난 경우 1은 생략함
            compressed += splited(-1)
        compression_length_array.append(len(compressed))
    return min(compression_length_array)  # 최솟값 리턴