문제
단위에 따라 문자열을 압축하되, 가장 짧은 문자열의 길이를 출력해야 합니다.
저는 우선 메소드 분리 없이 코드를 작성한 후, 시간이 조금 남아 함수 리팩토링을 해주었습니다.
단계
- step 단위로 문자열을 자르며 압축 가능 여부 확인
- step 단위로 잘린 직전 문자열과 현재 문자열이 같으면 중복 카운트 증가
- 같지 않을 경우, 최종 문자열 업데이트
-
가장 맨 마지막 문자열은 업데이트되지 않으므로, 루프를 빠져나간 후 한 번 더 체크해줍니다.
- 만들어진 문자열의 길이와, 이전까지의 길이 최소값 중 더 작은 값을 보관
코드
# 문자열 중복 여부에 따라 madeString(최종문자열)을 업데이트해주는 함수
def makeString(overlapCount, madeString, postString) :
# 중복이 있다면, overlapCount를 함께 업데이트
if overlapCount != 1 :
madeString += (str(overlapCount)+postString)
else :
madeString += postString
return madeString
def solution(s):
answer = 0
length = minL = len(s)
for step in range(1, length+1) :
madeString, postString, overlapCount = '', '', 1
# step 단위로 문자열을 자르며 압축 가능여부 확인
for c in range(0, length, step) :
tempString = s[c:c+step]
# 직전 문자열과 현재 문자열이 같으면 중복카운트 증가
if postString == tempString :
overlapCount += 1
else : # 아닐 경우, 최종문자열 업데이트
madeString = makeString(overlapCount, madeString, postString)
overlapCount, postString = 1, tempString # 초기화 작업
if len(madeString) >= minL : break
# 마지막 문자열은 체크하지 못하고 빠져나오므로 마지막 문자열 확인
madeString = makeString(overlapCount, madeString, postString)
minL = min(minL, len(madeString)) # 최소 길이 계산
return minL