프로그래머스 - 문자열 압축 (구현) with Python

jaehan·2022년 12월 28일
0

알고리즘

목록 보기
4/7
post-custom-banner

문자열 압축

문제

2020 KAKAO BLIND RECRUITMENT
https://school.programmers.co.kr/learn/courses/30/lessons/60057

문제 요약

문자가 주어졌을때 문자를 정해진 갯수만큼 묶어 연속되는 문자를 합쳐서 가장 짧게 만들
수 있는 경우를 찾아 그 문자의 길이를 출력하는 문제

예를 들어 "aabbaccc"인 문자인 경우 1개로 묶으면 a, a가 연속되기 때문에 2a,

b, b가 연속되기 때문에 2b, 다음 a는 연속되지 않으므로 (1)a,

c, c, c도 연속되기 때문에 3c 따라서 2a2ba3c로 줄일 수 있다.

풀이과정

위의 문제 요약한것 처럼 구현하면 되는 건데

우선 길이가 1이면 더이상 줄일 수 없기 때문에 바로 1로 return해주고

문자의 최대 길이가 1000이기 때문에 최소 비교값을 1001로 설정

가장 밖의 for문은 몇개씩 묶을 건지 (문자의 반 이상으로 묶으면 중복될 일 없기 때문에 길이의 반 까지만 설정)

내부 for문은 위에서 설정한 만큼 문자를 묶어서 순회 한다

내부 조건문은 이전 문자와 같을 때는 갯수만 +

이전 문자와 다를 때는 count로 비교해서 앞에 숫자를 붙힐지 말지를 결정한다

📌 내가 짠 로직으로는 마지막 문자가 for문을 나와서 prev에 저장되어 있기 때문에 마지막에 위와 같은 조건식을 하나 더 넣어서 마지막 문자도 넣어준다.

마지막으로 지금까지중에 가장 작은 문자의 갯수를 갱신하며 for문을 끝낸다.

코드

def solution(s):
    
    if(len(s) == 1): # 만약 문자 길이가 1이면 바로 1로 return
        return 1
    minStr = 1001 # 최대 길이가 1000임
    for j in range(1, len(s) // 2 + 1): # 몇개씩 묶을건지 정함
        count = 1 # 연속된 문자 갯수
        prev = "" # 이전 문자
        result = [] # 결과 배열
        for i in range(0, len(s), j):
            if s[i:i+j] == prev: # 이전 문자와 같으면 추가하지 않고 갯수만 +
                count += 1
            else: # 이전 문자와 다를때
                if count > 1: # 만약 2개이상 연속되었을때
                    result.append(str(count))
                    result.append(prev)
                else: # 처음 나온 문자일 때
                    result.append(prev)
                count = 1
            prev = s[i:i+j]
        # 마지막 문자열 추가    
        if count > 1:
            result.append(str(count))
            result.append(prev)
        else:
            result.append(prev)
        minStr = min(minStr, len("".join(result)))
        

    return minStr
post-custom-banner

0개의 댓글