문자열을 단위 별로 잘라서 앞과 뒤가 같은지 비교하여 count를 늘려가며 문자열을 붙여주면 된다.
- 첫번째 for문을 이용해 문자열을 자를 단위를 정해준다
How : 1부터 (len(문자열) // 2)까지, range는 +1까지
Why : 1개부터 문자열 길이의 절반이 되는 수까지의 단위로 문자열을 잘라서 비교하여 몇 개의 단위로 잘랐을 경우 가장 짧은지 알 수 있다.
Ex : "abcabc" -> 1부터 3까지의 단위로만 잘라봐도 2abc가 가장 짧은 경우인 걸 알 수 있다.
- 두번째 for문을 이용해 현재 부분과 다음 부분이 같은지 비교한다.
같을 경우 : count += 1
다를 경우 : 누적 문자열 += str(count) + 현재 부분
- 첫번째 for문이 끝나고 남은 문자열을 뒤에 붙여준다.
- 누적 문자열의 길이를 answer과 비교하여 짧으면 갱신한다.
def solution(s): answer = len(s) for step in range(1, len(s)//2 + 1): prev = s[:step] comp = "" cnt = 1 for j in range(step, len(s), step): nex = s[j:step+j] if prev == nex: cnt += 1 else: if cnt >= 2: comp += str(cnt) + prev else: comp += prev cnt = 1 prev = nex if cnt >= 2: comp += str(cnt) + nex else: comp += nex answer = min(answer, len(comp)) return answer
s = input() answer = len(s) for step in range(1, len(s)//2 + 1): prev = s[:step] comp = "" cnt = 1 print(step, "개 단위로 자를 경우") for j in range(step, len(s), step): nex = s[j:step+j] print("앞: ", prev, " 뒤: ", nex, " 비교") if prev == nex: cnt += 1 print("앞과 뒤가 같으므로, cnt 1 증가: ", cnt) else: if cnt >= 2: comp += str(cnt) + prev print("앞과 뒤가 다르므로, 문자열 이어 붙이기: ", comp) else: comp += prev print("앞과 뒤가 다르므로, 문자열 이어 붙이기: ", comp) cnt = 1 prev = nex if cnt >= 2: comp += str(cnt) + nex else: comp += nex print("마지막 문자열 이어 붙이기: ", comp) print("누적 문자열 길이: ", len(comp)) answer = min(answer, len(comp)) print("가장 짧은 길이(답): ", answer)