https://school.programmers.co.kr/learn/courses/30/lessons/60057
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) # 최솟값 리턴