https://programmers.co.kr/learn/courses/30/lessons/60057
문제
예제 입력 출력
문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다.
따라서 주어진 문자열을 x / ababcdcd / ababcdcd 로 자르는 것은 불가능 합니다.
이 경우 어떻게 문자열을 잘라도 압축되지 않으므로 가장 짧은 길이는 17이 됩니다.
"a b b a a b b a"를 나눠 묶을 수 있는 단위는 1, 2, 3, 4까지만 가능하다.
문자열을 s로 입력받는다고 하면, 문자열을 나눠 묶을 단위는 1에서 len(s) // 2까지 가능하다.
단위에 따라 문자열을 나눠 묶어주도록 한다. (항상 제일 앞에서부터 정해진 길이만큼 잘라야 한다.)
나눠 묶어진 문자열들을 비교해가며 동일한 개수를 세어주며 새로 문자열을 구성한다.
다음 함수는 단위만큼 문자열을 다시 재구성하는 함수이다.
def solution(s):
if len(s) == 1:
return 1
for i in range(1, len(s)//2 + 1): # 단위는 1에서 len(s)//2까지 가능하다.
arr = []
couple = ''
left = 0
right = i
for j in range(len(s)//i): # len(s) // 단위 만큼 반복하여 문자열을 단위만큼 나눠 묶는다.
couple = s[left:right]
arr.append(couple)
left = right
right += i
if len(s) % i != 0: # 단위로 나눠떨어지지 않는 경우, 남아버린 문자열을 묶어버린다.
arr.append(s[left:])
min_val(arr)
return min(answer)
단위를 1부터 len(s) // 2까지 구성할 수 있도록 for문 이용한다.
그 후, 문자열의 길이를 단위로 나눈 몫만큼, 리스트 슬라이싱을 통해 단위만큼 구성된 문자열을 arr에 삽입힌다.
(couple로 문자열을 슬라이싱하여 리스트에 삽입하는 과정을 좀더 간략하게 구성하고 싶었고, 길이가 1인 경우에는 1이 출력되는 조건문을 생략하고 싶었다. 또한, 문자열이 단위로 나누어 떨어지지 않는 경우도 포함하여 해결하고 싶었다. ✔ 리스트 슬라이싱으로 초깃값, 최댓값, 증감값 이용 등의 방식으로 간략하게 줄일 수 있었다.)
def min_val(arr):
prev = arr[0]
cnt = 1
result = ""
for i in range(1, len(arr)):
if prev == arr[i]:
cnt += 1
else:
if cnt > 1:
result += str(cnt) + prev
else:
result += prev
cnt = 1
prev = arr[i]
if cnt > 1:
result += str(cnt) + prev
else:
result += prev
answer.append(len(result))
입력받은 arr[0]을 prev에 넣어준 후, 그 다음부터 for문을 돌며, 일치하는만큼 개수를 세어준다.
세어준 개수가 1 이상이라면, 문자열과 수를 함께 붙여 넣어주고, 1과 같다면, 1을 제외하고 문자열만 붙인다.
그 후 문자열의 길이를 answer에 담아 기록해둔다.
✅[ CODE ]
answer = []
def min_val(arr):
prev = arr[0]
cnt = 1
result = ""
for i in range(1, len(arr)):
if prev == arr[i]:
cnt += 1
else:
if cnt > 1:
result += str(cnt) + prev
else:
result += prev
cnt = 1
prev = arr[i]
if cnt > 1:
result += str(cnt) + prev
else:
result += prev
answer.append(len(result))
def solution(s):
if len(s) == 1:
return 1
for i in range(1, len(s)//2 + 1):
arr = []
couple = ''
left = 0
right = i
for j in range(len(s)//i):
couple = s[left:right]
arr.append(couple)
left = right
right += i
if len(s) % i != 0:
arr.append(s[left:])
min_val(arr)
return min(answer)
초깃값 : 최댓값 : 증감값을 이용하여 리스트 슬라이싱을 이용해주어 단위만큼 문자열을 구성해주었다.
리스트 컴프리헨션을 이용하여 대괄호 안에 조건문이나 반복문을 넣는 방식을 이용해주었다.
✅[ CODE ]
s = input()
def solution(s):
answer = len(s)
for i in range(1, len(s) // 2 + 1): # 단위는 1에서 len(s)//2까지 가능하다.
arr = [s[j:j+i] for j in range(0, len(s), i)] # 단위만큼 문자열을 나눈다.
arr.append('')
prev = arr[0]
cnt = 1
length = 0
for j in range(1, len(arr)):
if prev == arr[j]:
cnt += 1
else:
length += len(prev) + (len(str(cnt)) if cnt > 1 else 0)
prev = arr[j]
cnt = 1
answer = min(answer, length)
return answer
print(solution(s))