본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[프로그래머스] Lv.2 문자열 압축 - Python

by chaemj97 2022. 5. 12.
728x90

https://programmers.co.kr/learn/courses/30/lessons/60057

 

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

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

programmers.co.kr


  • 코드(for문 사용)
def solution(s):
    # 최초에 문자열이 분할이 안되면 결국 입력된 문자열의 길이가 최소의 길이가 됨
    answer = len(s)  

    # 문자열을 앞출할때 최소단위는 1에서 문자열길이의 반이다
    for step in range(1, len(s) // 2 + 1):  
        # 예를 들어 aaa 면 3a abcabc면 2abc 지만 abcdabc는 압축할 수 없다.
        # 압출 결과
        compressed = ''
        # 처음 압출할 문자열 
        prev = s[0:step]
        # 반복 갯수  
        count = 1  
        # step만큼 압축하기로 했으므로 step만큼 건너뛴다.
        for j in range(step, len(s), step):
            # 다음 스텝만큼 갔는데 압축할 문자열이랑 같으면  
            if prev == s[j:j + step]:
                # 반복 갯수 추가  
                count += 1
            # 같지 않다면  
            else:  
                # 압축한 문자열이 2이상부터 숫자를 메길 수 있음
                if count >= 2:  
                    # 압축한 문자열을 카운트한 숫자와 합침
                    compressed += str(count) + prev  
                # 갯수가 1이면 생략
                else:  
                    compressed += prev
                # 이전에 저장된 압축문자열과 다르므로 새로운 압축문자열로 선정
                prev = s[j:j + step]  
                # 다시 1부터 갯수 세기
                count = 1  

        # 맨마지막꺼 고려해주기
        if count >= 2:  
            compressed += str(count) + prev  
        else:  
            compressed += prev

        # 완성된 압축 문자열과 현재 answer로 정의된 것 길이비교해서 작은걸로 선정
        answer = min(answer, len(compressed))  
    return answer

  • 코드(while문 사용)
def solution(s):
    # 최초에 문자열이 분할이 안되면 결국 입력된 문자열의 길이가 최소의 길이가 됨
    answer = len(s)
    
    # i : 나눌 갯수 1~(문자 길이의 절반)
    for i in range(1,len(s)//2+1):
        # 미리 i개로 나누어 리스트로 정렬
        split_s = []
        for j in range(0,len(s),i):
            split_s += [s[j:j+i]]
        # 압축 결과
        result = ''
        # 반복 갯수
        num = 1
        # 비교 인덱스 start : 기준값, end : 비교값
        start = 0
        end = 1

        while start != len(split_s):
            # end가 index를 벗어났다는 것은 마지막인덱스까지 비교 끝났다는 뜻
            if end == len(split_s):
                # 1은 의미 없으니 추가X
                if str(num) != '1':
                    result += str(num)
                result += split_s[start]
                break
            # 비교해서 같지않다면 압축결과에 반복 갯수와 문자추가
            if split_s[start] != split_s[end]:
                # 단 반복 갯수가 1이면 숫자 추가X
                if str(num) != '1':
                    result += str(num)
                result += split_s[start]
                # 기본값을 비교값으로 옮기기
                # 반복 갯수 1로 초기화
                start = end
                num = 1
            # 비교해서 같다면 반복 갯수 1추가
            else:
                num += 1
            end += 1

        # 압축 길이 비교
        answer = min(answer,len(result))

    return answer
728x90
반응형

댓글