from collections import defaultdict
def solution(s):
answer = defaultdict(list)
for i in range(1, len(s)+1):
temp = [s[k:min(k+i,len(s))] for k in range(0,len(s),i)]
result = defaultdict(lambda: 0)
tempAnswer, prev = "", ""
for item in temp:
if item == prev:
result[item] += 1
else:
if result[prev]:
if result[prev] > 1:
tempAnswer += str(result[prev])
tempAnswer += prev
result = defaultdict(lambda: 0)
prev = item
result[item] += 1
if result[prev]:
if result[prev] > 1:
tempAnswer += str(result[prev])
tempAnswer += prev
answer[len(tempAnswer)].append(tempAnswer)
return sorted(answer.keys())[0]
조건대로 설계만 하면 풀리는 무난한 구현 문제였다.
다만
로직을 더 깔끔하게
짜는 연습을 하기에 좋은 문제인 것 같다.
예를 들어, 문자열 단위를 1~len(s) 만큼씩 잘라 temp라는 배열에 넣을 것이라면,
# 이전코드
temp = []
for k in range(0,len(s),i):
if k+i-1 < len(s):
temp.append(s[k:k+i])
else:
temp.append(s[k:])
위와 같은 식으로 처리하면 로직은 맞지만 코드가 너무 길어지고 더러워진다.
하지만 배열을 선언하는 동시에 초기화하는 방식으로 짠다면?
# 개선코드
temp = [s[k:min(k+i,len(s))] for k in range(0,len(s),i)]
훨씬 보기에 깔끔하고 직관적인 코드가 된다.
앞으로는 알고리즘 문제 풀이를 할 때,
이런 디테일을 신경 써서풀이 시간을 줄이고
직관적이지 않은 코드를 짜는 코딩 습관
을 개선하고자 노력할 것이다.
문제 출처:https://school.programmers.co.kr/learn/courses/30/lessons/60057