honey_pot
[python] 문자열 압축 본문
https://programmers.co.kr/learn/courses/30/lessons/60057
def solution(s):
answer = 5000000
for slicing in range(1, len(s)//2+2):
res = '' # 결과를 담을 변수
cnt = 1 # 단위가 반복된 횟수
temp = s[:slicing] # 단위만큼 슬라이싱한 문자열을 담는다.
for i in range(slicing, len(s)+slicing, slicing): # slicing부터 시작해서 slicing 만큼 더해서 len(s)+slicing(s 전체 길이)만큼
if temp == s[i:i+slicing]:
cnt += 1
else:
if cnt == 1:
res += temp
else:
res = res + str(cnt) + temp
temp = s[i:i+slicing] # temp를 비교한 문자열 다음부터 slicing만큼 잘라서 저장
cnt = 1 # cnt 다시 1로 초기화
answer = min(answer, len(res))
return answer
⭐ 키포인트는 슬라이싱할 N의 단위는 주어진 s의 길이의 반이 최대치이고, 단위가 1인 경우에 s의 최소 길이가 2부터 시작하기 때문에 range의 값이 len(s)//2+1이 아니라 len(s)//2+2 가 된다는 점이다.
반복문 내용
✔ slicing은 1부터 시작해서 최대 길이인 s의 절반에 단위가 1일때를 감안해서 s의 최소 길이 2를 더한 값까지(len(s)+1)까지 반복하게 된다.
✔ temp와 slicing만큼의 문자열이 같으면 cnt+1
✔ 안 같으면
1. cnt 가 1일때는 슬라이싱 문자열 앞에 개수를 붙이지 않는다 ➡ res에 단위 문자열만 담음
2. cnt가 1이 아닐 때에는 slicing 값을 변경하고 res에 cnt와 단위였던 문자열을 넣는다.
3. temp의 값을 비교한 문자열 다음부터 단위만큼 잘라서 다시 저장
4. cnt도 1로 다시 저장
곱하기처럼 생각했다가 문제 해석 부분이 이해가 안 가는 부분이 있어서 참조했다.
참조 : https://whwl.tistory.com/68
'문제 풀이' 카테고리의 다른 글
[python] 메뉴 리뉴얼 (0) | 2021.11.20 |
---|---|
[python] 괄호 변환 (0) | 2021.11.19 |
[python] 카펫 (0) | 2021.11.07 |
[python] 다리를 지나는 트럭 - queue (0) | 2021.11.06 |
[python] 프린터 - queue, any (0) | 2021.11.06 |
Comments