[프로그래머스] 2020 KAKAO - 문자열 압축
https://programmers.co.kr/learn/courses/30/lessons/60057?language=python3
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
[풀이 과정]
1. 입력으로 들어온 문자열의 길이가 1이라면 1을 return한다.
2. 문자열의 길이가 1이 아니라면 반복문을 실행한다.
- i는 1~len(s)//2까지이며 나누려는 문자열의 길이이다.
- arr에는 나눈 문자열을 담고, count는 반복된 개수, total을 압축 후 문자열 전체 길이를 담을 변수이다.
- j는 전체 문자열을 i길이만큼 나눌 때 사용한다.
- 현재 arr에 아무 값이 없다면 i길이만큼 나눈 문자열을 넣고 count에 1을 추가한다.
- arr에 값이 있을 때 다음 i길이 문자열이 arr와 같다면 count의 마지막 값을 1 증가시킨다.
이때 i+j가 len(s)보다 길다면 현재 문자열 조각이 마지막 조각이므로 그 길이만큼 total에 추가한다.
- arr에 값이 있을 때 다음 i길이 문자열이 arr와 같지 않다면 total에 arr길이만큼 추가하고 arr를 새로운
문자열 조각으로 업데이트 후 count에도 1 추가한다.
이때도 i+j가 len(s)보다 길다면 현재 문자열 조각이 마지막 조각이므로 그 길이만큼 total에 추가한다.
3. count 리스트에서 한 값씩 꺼내면서 1인 경우엔 출력할 필요가 없으므로 넘기고 1이 아닐 경우엔 그 값을 문자열로 바꾼 후 그 길이를 total에 더해준다.
ex) c = 14이면 total에 2를 추가하기 위해 len(str(c))을 해준다.
4. 모든 길이에 대해 탐색을 끝내면 res에 들어간 값들 중 최소 길이를 answer에 넣고 return한다.
[소스 코드]
def solution(s):
if len(s) == 1: answer = 1
else:
res = []
for i in range(1, len(s)//2+1):
arr, count, total = '', [], 0
for j in range(0, len(s), i):
if len(arr) == 0:
arr = s[j:j+i]
count.append(1)
else:
if arr == s[j:j+i]:
if i+j >= len(s) : total += len(s) - j
count[-1] += 1
else:
if i+j >= len(s) : total += len(s) - j
total += len(arr)
arr = s[j:j+i]
count.append(1)
for c in count:
if c == 1: continue
else: total += len(str(c))
res.append(total)
answer = min(res)
return answer