0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ロジックサマナー ランクC「圧縮」(Python3) を解いた

Last updated at Posted at 2022-02-23

はじめに

ロジックサマナーというプログラミング学習サイトの問題の一つです。

解けるやろって適当に思ってたら、全然正答できなくて悩んでました。数日経っても、意地張って解こうとしましたが、解けなかったです。
そこで答えを探したんですが、欲しいコードがなかった。
なので、私が正答したソースコードをここに載せます。

問題の概要

問題はここにあります

制約はこちら

入力される値
S

条件
・1 ≦ ( S の長さ) ≦ 100
・S には "w"(白) か "b"(黒) の文字しか含まれない

入出力例

入力:  "bbbwwwww"
出力:   3 5

入力:  "wwwwwbbb"
出力:   0 5 3

このように、w(白)から始まった場合は、0 を入れなきゃいけない。

正答したソースコード

実装はPython3で行いました。中には PHP や C# で書かれた正答のコードを見かけたんですが、私には読めなかったので、見るのは断念しました。。。

以下、正答した私のソースコードです。

string = list(input())
string.append('\0')
count = 0

if (string[0] == 'w'):  # 最初が白なら、"0"と出力する
    print("0 ", end="")

i = 0  # 配列の場所を示す

judge_str = string[0]  # 一つ前の文字を記憶しておく
while (i < len(string)):
    if (string[i] == judge_str):  # 数え上げの処理
        count += 1
        i += 1
    else :  # 異色やった場合の処理
        print(count, end="")  # ひとかたまりを抜けた一つ目
        count = 0
        judge_str = string[i]  # 記憶する
        if (i + 1 >= len(string)):
            continue
        print(' ', end="")  # '_'とかで空白を可視化したら、デバッグしやすいかも
print()  # 改行
        

私がC言語からプログラミング始めたからか、書き方的にC言語とかでも同じように書けると思います。

ソースコードの説明

string = list(input())
string.append('\0')
count = 0

ここでは、単純に文字列の後ろにアクセスできる配列を用意したかっただけですね。
'w'or'b'以外だったら、上記のコードで動くと思います。

if (string[0] == 'w'):  # 最初が白なら、"0"と出力する
    print("0 ", end="")

i = 0  # 配列の場所を示す

これは、最初の文字がw(白)だったら、0 と出力してます。
i は、配列の番号を示す変数です。

judge_str = string[0]  # 一つ前の文字を記憶しておく
while (i < len(string)):
    if (string[i] == judge_str):  # 数え上げの処理
        count += 1
        i += 1
    else :  # 異色やった場合の処理
        print(count, end="")  # ひとかたまりを抜けた一つ目
        count = 0
        judge_str = string[i]  # 記憶する
        if (i + 1 >= len(string)):  # '==' でもよかったけど、気持ち的に
            continue  # breakでもよかったかもしれん(検証してません)
        print(' ', end="")  # '_'とかで空白を可視化したら、デバッグしやすいかも
print()  # 改行

実際の入力が bbbwwwbwwbbbbb... といった具合に、wとbが繰り返し入力されるので、ループを用いて処理します。(最初、繰り返されると思ってなかった)

3行目でNULL文字を追加したのが活きてます。
else文の中で、圧縮した値を出力してます。

まとめ?

最後の最後っていうあたりで数日粘りました(多分)。結局、自力で解けました。
対ありです。

変数名の命名がクソって思うので、どなたかいい命名方教えてください...
あと、ソースコードの書き方わかりやすいかどうかも教えてください。 以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?