WjExplor Story

문자열 압축 게임 본문

AI 엔지니어 부트캠프/파이썬 데이터 분석 기초와 머신 러닝 기초

문자열 압축 게임

더블유제이플로어 2025. 9. 26. 18:08

문제 설명

  • 주어진 문자열에서 연속해서 같은 문자가 반복되는 경우, 그 문자와 반복 횟수를 이용해 새로운 형태로 문자열을 압축합니다. 예를 들어, "aabcccccaaa" 문자열은 "a2b1c5a3"로 압축될 수 있습니다.
  • 함수 설명
    compress_string(s: str) -> str:
    • s: 압축하고자 하는 문자열입니다.
  • 입출력 예시
    • 입력1:
    "aaabbaaa"
    
    • 출력1:
    "a3b2a3"
    
    • 입력2:
    "aabcccccaaa"
    
    • 출력2:
    "a2b1c5a3"

# 문제
def compress_string(s):
    i, cnt = 0, 1
    my_str = ""
    my_list = list(s)
    for i in range(0, len(my_list) - 1):
        if len(my_list) < 0:
            print("문자열 입력을 잘못하였습니다")
            return
        elif my_list[i] == my_list[i + 1]:
            cnt += 1
        elif my_list[i] != my_list[i + 1]:
            my_str += str(my_list[i]) + str(cnt)
            cnt = 1
        i += 1
    my_str += s[-1] + str(cnt)
    return print(my_str)

파이썬스럽게 코드 작성

itertools.groupby 활용

groupby는 이름 그대로 연속된 동일한 요소들을 그룹으로 묶어주는 아주 편리한 도구입니다.

동작원리

groupby("aabcccccaaa") 를 실행하면, 아래와 같이 그룹을 만들어줍니다.

  • 첫번째 그룹 : 'a' , ('a', 'a')
  • 두번째 그룹 : 'b' , ('b',)
  • 세번째 그룹 : 'c' , ('c','c','c','c','c')
  • 네번쨰 그룹 : 'a' , ('a','a','a')

이 그룹에서 키(key) 와 그룹(group)을 얻을 수 있다.

우리는 그룹의 길이를 세기만 하면 된다.

from itertools import groupby


def compress_string(s):
    if not s:  # 입력이 비어있는 경우 처리
        return ""
    result_parts = []
    # 1. groupby 로 연속된 문자를 그룹핑 합니다.
    for key, group in groupby(s):
        # 2. Key는 그룹의 문자('a'), group 은 해당 문자의 이터레이터입니다.
        # list(group) 으로 실제 그룹을 만들고 len() 으로 길이를 셉니다.
        count = len(list(group))

        # 3. f-string 을 이용해 "문자+개수" 형태의 문자열을 만듭니다.
        result_parts.append(f"{key}{count}")

    # 4. 만들어진 조각들(["a2","b1","c5","a3"]) 을 하나의 문자열로 합칩니다.
    return print("".join(result_parts))


compress_string("aabcccccaaa")  # a2b1c5a3

리스트 컴프리헨션으로 한 줄에 표현하기

from itertools import groupby

def compress_string(s):
    if not s:
        return ""

    # 리스트 컴프리헨션
    return print("".join([f"{key}{len(list(group))}" for key, group in groupby(s)]))

compress_string("aabcccccaaa")  # a2b1c5a3