문자열 압축

최민수·2023년 4월 12일
0

알고리즘

목록 보기
52/94
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

profile
CS, 개발 공부기록 🌱

0개의 댓글