728x90
def solution(s):
minLen = len(s)
for length in range(1, len(s)//2+1):
change = ""
tmp = s
while True:
if len(tmp)>=length:
count = 1
word = tmp[:length]
tmp = tmp[length:]
while len(tmp)>=length and word == tmp[:length]:
count+=1
tmp = tmp[length:]
if count>1:
change += (str(count)+word)
else:
change += word
else:
change += tmp
break
minLen = min(minLen, len(change))
return minLen
<내 풀이 분석>
length: 문자열을 자를 단위
change: length로 자른 결과, 압축된 문자열
min: change의 길이 중 가장 짧은 거
word: 기준이 되는 단어
count: word가 반복된 횟수
1. 문자열을 자르는 단위는 1 ~ len(s)//2 만 구해도 된다. (len(s)//2보다 큰 값은 어차피 잘라봤자 압축 안된다.)
ex) ababa => 3으로 잘라도 최소로 줄인 값 2aba를 절대 만들 수 없다.
2. while문 내부에서는 문자열을 length 단위로 나눈 결과를 구한다.
3. 남아있는 문자열(tmp)의 길이가 length보다 큰 지 확인 후, 기준 문자 word에 넣어준다. tmp는 word를 제외한 문자열로 갱신한다
word설정 후, while문으로 문자열의 다음 값이 word와 같은지 비교하고 같다면 count를 1 증가, tmp를 갱신
만약 word가 2번 이상 반복됐다면 change에 반복횟수(count)를 추가하고 word를 추가한다. ex) "2ab"
1번만 반복됐다면 change에 word를 추가해준다.
4. 남아있는 문자열(tmp)의 길이가 length보다 작다면 항상 word값과 같지 않기 때문에 압축할 수 없다. 그냥 change에 tmp문자열을 추가해주고 while문을 빠져나간다.
5. min값과 change문자열의 길이를 비교하여 최소값을 갱신해준다.
728x90
'알고리즘 > programmers[2]' 카테고리의 다른 글
[프로그래머스] 오픈채팅방: python3 (0) | 2022.01.28 |
---|---|
[프로그래머스] 행렬의 곱셈: python3 (0) | 2022.01.28 |
[프로그래머스] 더 맵게: python3 (0) | 2022.01.27 |