[programmers](Python)文字列圧縮


🧩 質問する

問題の説明
データ処理の専門家になりたい「音声器」は、文字列を圧縮する方法を学んでいる.最近,文字列に連続的に現れる同じ値を文字数と繰返し値として表すことによって,より短い文字列に減少する簡単な無損圧縮法を学習した.
例えば、「aabbacc」については、「2 a 2 ba 3 c」と表すことができ(文字が1回繰り返されていない場合は1を省略する)、このような方式の欠点は、重複文字が少ない場合に圧縮率が低いことである.たとえば、文字列「abcabcdede」は完全に圧縮されません.この欠点を解決するために、「ピッチ」は、文字列を1つ以上の単位に切り取ることで圧縮し、より短い文字列として表す方法を探します.
たとえば、「abbcddababccdcdd」は、文字を1単位に切り取ると全く圧縮されず、2単位に切り取ると「2 ab 2 cd 2 ab 2 cd」と表すことができます.異なる方法で8単位でせん断および圧縮を行う場合、「2 abbcdcd」を使用して表すことができ、これは圧縮が最も短い方法である.
別の例は「abcabcdede」であり、文字を2単位に切り取って圧縮すると「abcabc 2 de」になり、3単位に切り取ると「2 abcdede」になり、この3単位が最も短い圧縮方法になります.3つの単位を切り取り、最後に残った文字列を貼り付けます.
圧縮する文字列sをパラメータとして指定する場合は、上述した方法に従って1つ以上の単位で文字列を切り取り、solution関数を完了して、表す文字列の中で最も短い長さを返します.
せいげんじょうけん
sの長さは1または1000以下である.
sは小文字のみからなる.

文字列圧縮
🧩 首都コード
文字列の最初の文字を比較文字として指定し、前から文字を1つずつ移動し、文字列と同じかどうかを比較します.
文字列が同じ場合(=文字列が連続している場合)
変数に関連付けられた数値と文字列を格納
文字列が異なる場合
文字列を初期化し、次の文字列を比較します.
🏁 説明する
def solution(s):
    answer = len(s)
    for word in range(1, len(s)//2+1): # 반복될 단어가 문자열의 두 배를 넘을 수는 없음
        compressed = '' # 변환 단어 저장할 변수
        before = s[0:word] # s의 앞부터 word 만큼의 문자 추출 예) a, ab, aba ...
        count = 1 # 압축 수 

        for j in range(word, len(s), word): # word 크기만큼 증가 시키면서 문자열 비교
            if before == s[j:j+word]: # 앞의 글자가 현재 글자와 같으면 
                count += 1 # 압축 수 +1
            else: # 다른 문자열이면
                compressed += str(count) + before if count >= 2 else before #count가 2 이상이라면 compressed에 count와 함께 추가
                before = s[j:j+word] # before 초기화
                count = 1
        
        compressed += str(count) + before if count >= 2 else before # 남아있는 문자열도 동일하게
        answer = min(answer, len(compressed)) # 원래 문자열 크기와 비교 후 그중에 가장 짧은 문자열 출력
    return answer 
word = 1
j = 1,2,3,4,5,..
word = 2
j = 2,4,6,8,..
word = 3
j = 3,6,9,...