본문 바로가기

알고리즘 삽질장

[이코테] 구현 - 문자열 압축

반응형

해당 포스팅의 문제의 출처는 나동빈님의 이것이 취업을 위한 코딩 테스트 교재를 공부하면서 풀이할 때 본인의 사고 과정 흐름과 문제 풀이를 기록하기 위함 입니다. 

 


문제설명

해당 문제는 프로그래머스에서 제공하므로 하단의 링크를 참조해서 문제을 읽어보자.

# 문제 링크: https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

사고과정

  • 압축 단위의 범위는 주어진 문자열 길이를 2로 나눈 몫(문자열 길이 // 2)까지인 것을 잘 설정함. 그리고 하나의 압축 단위마다 주어진 문자열의 range의 step 단위로 돌면서 앞,뒤 문자열이 같으면 계속 압축하고, 다른 문자열이면 그대로 이어 붙이는 과정을 수행
  • 문제를 풀지 못했는데, 단위별로 압축하고 남은 문자열의 처리를 하는 것을 해결하지 못함. Python에서 리스트 슬라이싱을 할 때 주어진 길이보다 더 크게 한다고 한들 주어진 길이 끝까지만 출력하고 에러를 발생시키지 않는다. 또한 주어진 길이의 범위를 벗어난 인덱싱 슬라이싱을 주어도 빈 문자열 또는 리스트를 반환하고 에러를 발생시키지 않는다. 이 점을 평소에 알지 못해서 남아있는 문자열의 처리를 어떻게 할 줄 몰랐다..
  • 그리고 if 문을 간결하게 한줄로 사용해서 코드 간결화하는 것도 인상적.. 

풀이(스스로 풀지 못함)

def solution(s):
    answer = len(s)
    # 압축 단위 주기 Loop
    for step in range(1, len(s)//2 + 1):
        prev = s[0:step]
        count = 1
        result = ''
        for j in range(step, len(s), step):
            after = s[j:j+step]
            if prev == after:
                count += 1
            else:
                result += str(count) + prev if count > 1 else prev
                prev = after
                count = 1
        # 위 loop문 돌고 마지막 남은 문자열이 prev에 들어가 있는 상태
        result += str(count) + prev if count > 1 else prev
        answer = min(answer, len(result))
    return answer
반응형