AtCoder ABC 019 B – 高橋くんと文字列圧縮 Python解説

スポンサーリンク

高橋くんと文字列圧縮

高橋くんはある文字列 s を持っています。文字列を短く表現することに興味のある高橋くんは、以下の圧縮方法を試してみることにしました。

文字列 s を同じ文字が連続する文字列に分割します。(分割)
分割された各文字列を、文字と、その文字が連続する長さをつなげた新たな文字列に変換します。(変換)
最後に、変換した各文字列を前から順に結合します。(結合)

aabbbaad という文字列に上記の圧縮方法を適用すると
aabbbaad を aa bbb aa d に分割
aa bbb aa d を、それぞれ a2 b3 a2 d1 に変換
a2 b3 a2 d1 を a2b3a2d1 と結合

以上より、a2b3a2d1 を得ることができます。

あなたには文字列 s が与えられるので、上記の方法で圧縮された文字列を求めるプログラムを、高橋くんの代わりに書いてください。

AtCoder Beginner Contest 019 「高橋くんと文字列圧縮」

与えられた文字列をどんどん圧縮していきましょう。方法としては、文字をカウントしていき、違う文字が現れたらそこまでの文字とカウントを出力するやり方が考えられます。

s = input()
 
cnt = 1
ans = ""

for i in range(1, len(s)):
    # *1
    if s[i] == s[i - 1]: 
        cnt += 1
    else:
        ans += s[i - 1] + str(cnt)
        cnt = 1
    # *2
    if i == len(s) - 1:
            ans += s[i] + str(cnt)
            
print(ans)

(*1)s[i] == s[i -1]で1つ前の文字と比べています。文字が同じならcnt+1、文字が異なればansに1つ前の文字と、それまでのcntを加えています。また、新しく文字のカウントを始めるのでcnt = 1で初期化しています。

(*2)(*1)のif文では違う文字にならないとansに文字とcntを加えない処理になっているので、ここのif文で最後の文字になったら強制的に文字とcntを加える処理を記述しています。

最後にansを出力して完了です。