문제: 문자열이 주어졌을 때, 문제에서 주어진 방식으로 압축 시킬 수 있는 모든 방법중에서 가장 짧은 문자열의 길이를 구하는 문제입니다.
풀이 코드:
def solution(s):
answer = 0
length = len(s)
lst = [[] for _ in range((length - 1) // 2 + 2)]
string = ''
l = 1
while l <= (length - 1) // 2 + 1:
strlst = [s[i:i + l] for i in range(0, len(s), l)] # 1부터 (length - 1) // 2 + 1까지 길이에 맞춰 문자열 쪼개기
pos = strlst[0]
cnt = 0
for i in range(len(strlst)):
if strlst[i] == pos: # 앞선 문자열과 동일한 문자열이 들어온다면 갯수를 count하며 추가
cnt += 1
string += strlst[i]
else:
if cnt > 1: # 앞선 문자열과 다른 문자열이 들어온다면 문자열 압축 및 새로운 문자열 추가
string = string.replace(pos * cnt, '{}{}'.format(cnt, pos))
cnt = 1
string += strlst[i]
pos = strlst[i]
if i == len(strlst) - 1: # 동일한 문자가 반복되며 종료될 경우에 대한 처리 진행
if cnt > 1:
string = string.replace(pos * cnt, '{}{}'.format(cnt, pos))
lst[l] = list(string)
string = ''
cnt = 1
l += 1
answer = 1001
for i in lst[1:]:
if len(i) < answer:
answer = len(i)
return answer
풀이 방법:
- 첫번째는 문자열이 있을 때, 앞에서 부터 문자열 길이의 반 이상으로 쪼갠다면 중복되는 것이 생길 수 없으므로 범위를 (문자열 길이 -1)//2 +1 로 정의했습니다.
-> 'abcdefg' 를 'abcde' 'fg'로 쪼갠다면 앞의 문자열에 중복되는 문자열이 뒤에 나올 수 없습니다.
- 두번째로는, 쪼개진 문자열을 앞에서 부터 탐색하면서 다른 문자열이 나올 경우 앞선 문자열에 대한 압축과 동시에 새로 들어온 문자열을 추가해주었습니다.
- 마지막으로,동일한 문자('ababccc'에서 'c') 가 반복되며 종료될 경우를 위해 마지막 index에 대하여 처리하는 코드를 추가해주었습니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/python] 호텔 대실 (0) | 2023.03.02 |
---|---|
[프로그래머스/python] kakao 캐시 (0) | 2022.10.31 |
[프로그래머스/python] kakao 성격유형 검사하기 (0) | 2022.10.26 |
[프로그래머스/python] kakao 3차 압축 (0) | 2022.10.25 |
[프로그래머스/python] kakao 1차 뉴스 클러스터링 (0) | 2022.10.12 |