[프로그래머스] 문자열 압축 (Level2) - Python

조상래·2021년 6월 8일
0

python

목록 보기
8/8

1. 문제해석

- 문자열에서 반복적으로 나오는 문자를 반복 횟수 만큼 숫자로 묶어 압축한다.
- 문자 1 단위부터 ~ n 단위까지 압축시켜 가장 짧게 만들 수 있는 단위의 글자 수를 출력.
- 예를 들어 "aabbaccc"의 경우 1 단위 - 2a2ba3c로 압축이 가능하며 "abcabcdede"의 경우 3단위 - 2abcdede로 압축이 가능하다. 압축 후의 문자열의 길이 각각 7, 8을 리턴하면 된다.

2. 풀이

- 압축할 수 있는 단위는 최소 1 단위에서 최대 math.floor(문자열의 길이 / 2)까지이다.
- 1 단위부터 최대 단위까지 압축을 한 후 길이를 비교.
- 문자열을 압축해 줄 함수와 압축 단위를 입력해 줄 for 반복문을 이용한다.

import math

def solution(s):
    def simplify(num):
        stack = []
        rst = ''
        
        for i in range(0, len(s), num):
            cur = s[i: i + num] # 지정한 단위 만큼 자른다.
            if len(stack) == 0: stack.append([1, cur]) # 만약 stack이 비었다면 반복 횟수 1, 문자
            elif stack[-1][1] == cur: stack[-1][0] += 1 # stack안에 있는 마지막 문자와 비교해서 만약 같다면 반복 횟수 += 1
            else: stack.append([1, cur]) # 다르다면 반복 횟수 1, 문자
        
        for i in stack:
            rst += i[1] if i[0] == 1 else str(i[0]) + i[1] # stack이 완성되면 반복 횟수가 1인 경우를 제외하고 반복횟수 + 문자로 새로운 문자열을 만든다.
            
        return len(rst) # 문자열의 길이 리턴
    
    answer = []
    
    if len(s) < 2: return 1
    
    for i in range(1, math.floor(len(s) // 2) + 1): # 문자열의 절반까지 반복
        answer.append(simplify(i)) # 길이를 구해서 answer에 append
        
    return min(answer) # 가장 짧은 길이 리턴

더 좋은 방법이 있을거라 생각한다. 조금 무식한(?) 방법이지만 테스트는 통과했다.

profile
Codestates Full IM26기 수료

0개의 댓글