https://programmers.co.kr/learn/courses/30/lessons/60057
문자열을 잘라 비교하는 문제입니다.
문자열의 길이에 따라 다음과 같이 비교하며 비교하는 최대 길이는 문자열 길이의 절반입니다.
기준 문자열과 비교하는 문자열이 같을때와 다를때 각각의 처리
다른 예로, abcabcdede와 같은 경우, 문자를 2개 단위로 잘라서 압축하면 abcabc2de가 되지만, 3개 단위로 자른다면 2abcdede가 되어 3개 단위가 가장 짧은 압축 방법이 됩니다. 이때 3개 단위로 자르고 마지막에 남는 문자열은 그대로 붙여주면 됩니다. - 문제 中
위와 같이 남는 문자열이 남을때의 처리입니다.
전체 코드입니다.
def solution(s):
s_len = len(s)
answer = s_len
end = (s_len // 2) + 1
for i in range(1, end):
string = ""
num = 1
first = s[0:i]
for j in range(i, s_len+i, i):
compare = s[j:j+i]
if len(first) != len(compare):
if first == compare:
num += 1
if num > 1:
string += str(num)
string += first
if compare != "":
string += compare
break
if first == compare:
num += 1
else:
if num > 1:
string += (str(num) + first)
else:
string += first
first = compare
num = 1
first = s[j:j+i]
answer = min(len(string), answer)
return answer
단락마다 끊어서 보겠습니다.
def solution(s):
s_len = len(s)
answer = s_len
end = (s_len // 2) + 1
비교할 문자열 길이를 정할 큰 반복문입니다. i가 비교할 문자열의 길이를 나타냅니다.
문자열은 최소 길이가 1이므로 num은 1로 초기화합니다. 만약 비교하면서 같은 문자열을 찾는다면 num을 늘려나가며 압축숫자를 늘려갑니다.
가장 처음 기준이 될 문자열은 첫번째 문자열부터 i까지 슬라이싱한 문자열입니다.
for i in range(1, end):
string = ""
num = 1
first = s[0:i]
for j in range(i, s_len+i, i):
compare = s[j:j+i]
if len(first) != len(compare):
if num > 1:
string += str(num)
string += first
if compare != "":
string += compare
break
if first == compare:
num += 1
else:
if num > 1:
string += (str(num) + first)
else:
string += first
first = compare
num = 1
j 반복문이 모두 돌면 기존의 answer와 string의 길이를 비교해 작은 값을 answer에 저장합니다.
i 반복문이 모두 돌고 answer를 return하면 정답입니다.
answer = min(len(string), answer)
return answer
카카오 코딩테스트에서 단골로 등장하는 문자열 조작 문제입니다.
파이썬의 장점을 살려 list comprehension 등을 이용하거나 코드의 반복을 줄여 더 간결하고 가독성 좋게 짜고 싶었으나 아직까지는 역량이 많이 부족합니다.
C++을 병행하다보니 리스트 슬라이싱을 접했을때 순간 당황했습니다. 파이썬 개념을 좀 더 탄탄하게 잡아야겠습니다.