코딩일지/파이썬

2020 카카오 신입 개발자 코딩테스트 - 문자열 압축

야언 2023. 3. 25. 15:43

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

 

프로그래머스

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

programmers.co.kr

 

1. 문자열 자르기

 

모든 경우에서 가장 압축을 많이 시킨 문자열의 길이를 반환 -> 모든 경우의 수를 파악해야 하므로 반복문

문자열을 자를 시 n//2 이상의 길이 부터는 나눠도 중복되는 피스가 없으므로 반절까지만 쪼갠다(문자열 슬라이싱)

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

 

 

2. 중복 문자열 확인

 

반복을 통해 앞의 문자열과 현재 문자열이 동일한지 확인

동일하다면 count 를 계속해서 늘려나가고, 다른 순간이 오면 compressed 라는 변수에 추가

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

그리고 반복문이 끝난 뒤 마지막에 남은 꼬다리를 추가

그렇게 나온 값들 중에서 가장 최솟값을 반환하면 ok

 

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)  # 최솟값 리턴