[프로그래머스] 문자열 압축 (Level2) - Python
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) # 가장 짧은 길이 리턴
더 좋은 방법이 있을거라 생각한다. 조금 무식한(?) 방법이지만 테스트는 통과했다.
Author And Source
이 문제에 관하여([프로그래머스] 문자열 압축 (Level2) - Python), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tkdfo93/프로그래머스-문자열-압축-Level2-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)