해당 문제를 확인하시고 싶으면 아래 링크를 통해 확인해주세요!
https://school.programmers.co.kr/learn/courses/30/lessons/60057
이 문제는 완전탐색으로 해결이 가능하다.
1개씩 나눴을 때, 2개씩 나눴을 때 등 케이스를 모두 확인해서 각 케이스별로 나오는 결과 문자열의 길이를 저장해서 최소값을 반환하면 된다.
이 때 문자열 탐색은 문자열 길이의 반까지만 탐색이 가능하다.
예를들어 문자열 길이가 8이면 총 4개씩 나누는 것 까지 가능하다.
5개를 기준으로 나누게 되면 나누지 못한다.
"""
프로그래머스 LV2: 문자열 압축
https://school.programmers.co.kr/learn/courses/30/lessons/60057
2020년도 KAKAO BLIND RECRUITMENT
"""
def solution(s):
answer = []
# s의 길이가 1이면 바로 return
if len(s) == 1:
return 1
# 문자열 쪼갤 수 있는건 len(s) // 2 + 1
# 문자열 길이가 8이면 최대 4개씩 자를 수 있음. 길이가 9여도 최대 4개
for sp in range(1, (len(s)//2 + 1)):
temp_str = s[:sp] # 기준 문자열
temp_result = ''
count = 1 # 같은 문자 연속 횟수
for i in range(sp, len(s), sp):
target_str = s[i:i+sp] # 비교 문자열
if temp_str == target_str: # 비교했는데 같을경우
count += 1
else: # 비교했는데 문자열이 다른 경우
temp_result += str(count) + temp_str if count > 1 else temp_str
# 초기화 작업
count = 1
temp_str = s[i:i+sp]
# 남아있는 문자열 처리
temp_result += str(count) + temp_str if count > 1 else temp_str
answer.append(len(temp_result))
return min(answer)
나는 남아있는 문자열 처리에서 애를 먹었다.
풀지 못하고 구글링을 통해 다른 사람의 풀이를 참고했다.
2번째 for문을 돌고나면 아마 문자열 모두를 돌지않고 남는 부분이 있는데 그 남는 부분을 처리해줘야 확인이 가능하다.