https://programmers.co.kr/learn/courses/30/lessons/60057
def solution(s):
answer = len(s) # 최소 길이
# 자르는 단위 늘려가며 최소 길이 계산
for slice in range(1, len(s)//2+1):
result = "" # 압축된 문자열
count = 1 # 반복되는 횟수
compare = s[0:slice] # 자른 문자열
# 압축된 문자열 구하기
for i in range(slice, len(s), slice):
# 문자열이 반복되는 경우
if compare == s[i: i+slice]:
count += 1
# 더 이상 압축할 수 없는 경우
else:
if count == 1:
result += compare
compare = s[i: i+slice]
else:
result += (str(count) + compare)
count = 1
compare = s[i: i+slice]
# 나머지 문자열 처리
if count == 1: result += compare
else: result += (str(count) + compare)
answer = min(answer, len(result)) # 최소 길이 계산
return answer
이 문제는 for문과 if문이 많아서 뭔가 되게 복잡하게 느껴지는 문제였습니다. 하나씩 차근차근 풀어나가는 것이 중요한 것 같습니다.
먼저 자르는 단위를 늘려가면서 최소 길이를 구하기 위해 for문을 사용합니다. 자르는 단위가 문자열 길이를 넘기면 안되니까 for문은 1부터 len(n)//2까지 반복하도록 합니다. 문자열을 앞 뒤로 비교하기 위해 compare에 문자열을 잘라 저장합니다.
압축된 문자열을 구하기 위해 for문을 하나 더 사용합니다. compare의 다음 문자열부터 비교해야하므로 for문을 자른시점부터 문자열 끝까지 자른 단위 간격으로 반복합니다. 여기서 compare과 다음 자른 문자열이 같다면 count에 1를 더해줍니다. 문자열이 반복될 때마다 count값을 증가시켜 반복된 횟수를 구합니다. 이제 더 이상 문자열이 반복되지 않고 압축할 수 없는 경우에는 count 값에 따라 처리가 달라집니다. count 가 1일 경우 result에 compare 값을 더해주고 다음 문자열로 넘어가 반복되는지 확인하기 위해 compare은 다음 문자열로 초기화해줍니다. count가 1이 아닐 경우에는 반복된 횟수(str(count))와 compare를 result에 저장하고 compare과 count 모두 초기화 해줍니다.
for문이 다 끝나도 처리되지 않은 나머지 문자열을 처리해줍니다. 마지막으로 answer와 압축된 문자열 result 중 최소 길이를 구해 answer에 저장합니다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] 소수 찾기 - Level2 (0) | 2021.05.17 |
---|---|
[프로그래머스/Python] 모의고사 - Level1 (0) | 2021.05.15 |
[프로그래머스/Python] H-Index - Level2 (0) | 2021.05.12 |
[프로그래머스/Python] 가장 큰 수 - Level2 (0) | 2021.05.09 |
[프로그래머스/Python] K번째수 - Level1 (0) | 2021.05.09 |