문자열 압축
https://programmers.co.kr/learn/courses/30/lessons/60057
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
부끄럽게도 min_length를 별 생각없이 9999로 지정하여 문제를 풀었다가, 길이가 1인 문자열이 들어온 경우 for loop을 돌지 않아 9999가 min_length로 반환되는 일이 발생했다...
for loop과 초기화는 항상 빈틈없게...
def solution(s):
answer = ""
min_length = len(s)
for unit in range(1,len(s)//2+1):
splitted = []
compressed = ""
for i in range(0,len(s),unit):
splitted.append(s[i:i+unit])
head = splitted[0]
cnt = 1
for cur in splitted[1:]:
if cur == head:
cnt+=1
else:
if cnt != 1:
compressed = compressed + str(cnt)
compressed = compressed + head
cnt = 1
head = cur
if cnt != 1:
compressed = compressed + str(cnt)
compressed = compressed + cur
if len(compressed) < min_length:
min_length = len(compressed)
return min_length
문자열을 1개씩 ~ 문자열 길이 절반 개수씩 쪼개가면서 가장 짧게 압축되는 경우를 찾는다.
split을 완료하고 나면 head에는 가장 앞의 쪼갠 문자열을 대입하고, 그 다음 문자열 조각부터 for loop을 수행한다.
이 때, head와 cur가 같으면 압축이 가능하다는 의미이므로 cnt를 1 증가시키고 넘어간다.
head와 cur가 같지 않은 경우, head는 더이상 압축이 불가능하다는 뜻으로, 두 개 이상 중복된 경우 카운트 횟수를 압축된 문자열에 출력한 뒤, head를 출력하고, head를 현재의 cur로 변경시킨다.
for loop을 다 돌고 나면, 마지막 head에 대한 나머지 처리를 해준다.
min_length보다 압축한 문자열의 길이가 더 작은 경우, min_length를 갱신한다.
쓸데없는 실수로 멘붕해서 쉬운문제에서 시간뺏기는 일이 없도록 해야겠다.