풀이
우선 문자열이 한개만 올 수 있으므로 해당 경우를 처리했습니다.
다음으로, 문자열을 1개부터 최대로 자를 수 있는 개수인 len(s) / 2 만큼까지 각각 일정하게 잘라 리스트에 저장했습니다.
그 다음 반복문을 통해 리스트의 인덱스를 사용해서 이전의 값과 같다면 압축을 할 수 있으므로 cnt를 +1 시켜주었습니다.
그리고 만약 다를경우 cnt가 1이라면 이전의 자른 문자가 한 번만 나온것이므로 그대로 압축문자열에 저장해주고 1보다 클 경우에는 압축이 가능하므로 cnt를 문자열로 변환시켜 이전 문자앞에 추가하여 압축문자열에 저장했습니다.
이때, 현재 인덱스는 이전까지와 다른 문자열이므로 이전 문자열을 압축문자열에 저장하고 현재 문자열은 처음 나온 것 이므로 cnt를 1로 초기화를 했습니다.
마지막으로 반복문을 사용할경우 마지막 자른 문자열은 압축문자열에 추가가 안되므로 직접 처리해주고 길이가 가장 짧은 압축문자열을 구해 해결했습니다.
코드
def solution(s):
answer = 987654321
# 문자열이 한개일 수 있다
if len(s) == 1:
return 1
max_zip_len = len(s) // 2
str_len = len(s)
for i in range(1, max_zip_len + 1):
zip_str_list = [s[j:j + i] for j in range(0, str_len, i)]
cnt = 1
zip_result = ""
zip_str_list_len = len(zip_str_list)
for idx in range(1, zip_str_list_len):
if zip_str_list[idx - 1] == zip_str_list[idx]:
cnt += 1
else:
if cnt > 1:
zip_result += str(cnt)
zip_result += zip_str_list[idx - 1]
cnt = 1
if cnt > 1:
zip_result += str(cnt)
zip_result += zip_str_list[zip_str_list_len - 1]
answer = min(answer, len(zip_result))
return answer
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Python] 괄호 변환 (0) | 2021.03.21 |
---|---|
[Python] 메뉴 리뉴얼 (0) | 2021.03.15 |
[Python] 다트 게임 (0) | 2021.03.07 |
[Python] 실패율 (0) | 2021.03.06 |
[Python] 비밀지도 (0) | 2021.02.28 |