import re
def solution(s):
if len(s) == 1: # 이거 안하면 테스트 5에서 실패
return 1 # 문자열이 하나 들어왔을때 생각해야함
length_str = []
for i in range(1, len(s)//2+1): # 슬라이스 크기 (1씩 끊고, 2씩 끝고...)
pattern = f'[a-z]{{{i}}}' # 영문자열을 i개씩 끊어서 나눔
pattern = re.compile(pattern)
compressed_str = ''
split_str = pattern.findall(s)
count = 1
for j in range(len(split_str)-1):
if split_str[j] == split_str[j+1]: # 앞과 다음게 같아? 반복돼?
count += 1
# 아니면 이제 붙여줘.
else:
if count > 1:
compressed_str += f'{count}{split_str[j]}'
count = 1 # 다시 count=1로 초기화 다음을 위해
else: # 만약 count가 1이면
compressed_str += f'{split_str[j]}' # count 숫자는 빼고 삽입
# 맨 마지막 이전 문자열과 맨 마지막 문자열 비교를 위해 -2
if j == len(split_str)-2: # 예를 들어 aabbaccc 경우와 2개씩 자른 경우
if count > 1: # 2개 이상 붙어 있으면
if split_str[j] == split_str[j+1]: # ac와 cc를 비교
compressed_str += f'{count}{split_str[j]}' # 추가해서 넣어줘
else: # 만약 하나짜리면 (cc 하나짜리) 그냥 넣어줘
compressed_str += f'{split_str[j+1]}' # 맨 마지막 남은 cc
if len(s) % i != 0:
compressed_str += s[-(len(s)%i):] # 자르고 남은거 붙여주기
length_str.append(len(compressed_str))
return min(length_str)
두번째 방법이 더 나은거 같다.
밑에 두번째 방법을 보자
def solution(s):
min_len = len(s)
for i in range(1, len(s)//2 + 1): # 절반만 보면 된다
new_s = ''
cnt = 1
for j in range(0, len(s), i):
if s[j:j+i] == s[j+i:j+2*i]:
cnt += 1
else:
if (cnt != 1): # 2이상이면
new_s += str(cnt) # 숫자를 붙이고
new_s += s[j:j+i] # 문자를 붙이면 된다. 자연스럽게 하나짜리는 문자만 붙어짐
cnt = 1
min_len = min(min_len, len(new_s))
return min_len