Lim Seunghyun Space

[프로그래머스] 문자열 압축 본문

Algorithm/문제

[프로그래머스] 문자열 압축

Lim Seung Hyun 2021. 12. 5. 16:03

문제 링크

 

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

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

programmers.co.kr

 

문제 해설

  • 문자열 s을 n개 단위로 잘라서 압축해서 생성한 문자열의 최소 길이를 구하기 (n = 1,2,3,4,..)

 

나의 풀이 (Python)

def solution(s):
    
    answer = 1001
    
    for i in range(1, len(s) + 1):
        comp = ""
        count = 1
        previous = ""
        for j in range(0, len(s), i):
            part = s[j:j+i]
            
            if j == 0:
                previous = part
            else:
                if previous == part:
                    count += 1
                else:
                    if count == 1:
                        comp += previous
                    else:
                        comp += str(count) + previous
                    previous = part
                    count = 1
            
        if count == 1:
            comp += previous
        else:
            comp += str(count) + previous
        
        answer = min([len(comp), answer])
        
    return answer
  • s의 길이는 1000 이하 이면서 최솟값을 구해줄 것이기 때문에 answer은 1000 +1 로 초기화
  • 1부터 문자열의 길이만큼 반복해서 각 케이스마다 생성되는 문자열의 길이를 계산
    • s = "abab"라면 1부터 4까지 반복 => for i in range(1, len(s) + 1)
    • 문자열의 길이를 초과하는 수로 문자열을 나누는건 의미가 없음
      • s = "aba"이고, 4개씩 문자열을 나누는 것은 3개씩 문자열을 나누는 것과 동일
  • comp에는 압축한 문자열을 담고, previous는 이전 문자열을 보관할 임시 변수, count는 previous변수와 얼마나 동일한지 카운팅을 해줄 변수
  • 문자열 분할에서 인덱스는 range을 이용
    • range(n, m, l) -> n부터 m-1까지 l씩 띄움
  • 압축 로직
    • part에 분할된 문자열을 보관하고, previous와 비교하여 같으면 count를 1 증가하고 아니라면 압축한 문자열을 comp에 더 해주는 방식으로 진행

 

Github : https://github.com/Limseunghyun95/code_test/blob/master/programmers/p_60057.py

  •  
728x90