003Qualification

AtCoder練習問題日記 B-Qualification simulator

近況報告

最近は精神的にかなり落ち込んでいて、物事に取り組むのが大変でした。しかし、少しでも趣味としてプログラミングを続け、小さな達成感を得たいと思い、「B-Qualification simulator」という問題にトライしました。問題を解くことで、少し前向きな気持ちになれたように感じます。

問題文の理解

まず、問題文をしっかり読んで理解することから始めました。問題の制約や内容を現実のイメージと結びつけながら理解することが重要です。

今回の問題では、参加者の数はN人で、与えられた文字列Sは、各要素 “a”, “b”, “c” のいずれかです。これらの文字が参加者の種類を示しており、例えば “a” や “b” は国内または海外の学生を表すようです。

問題文にはSのi文字目が予選でi位とあり、Sの文字列自体が成績順になっているとわかるので、成績順に並べ替える処理をする必要はありませんでした。これは問題をシンプルにするポイントでした。

問題文に潜むヒント

問題文の中盤には、予選通過者の合計がA + B人未満であればどうするか、といった内容が書かれていました。最初は、Aが国内学生、Bが海外学生の予選通過予定者数なのだろうと考えましたが、読み進めると、Bは海外学生の予選通過者数に関連することが分かりました。このように、問題文をじっくり読むことで、解決のヒントが見つかります。

コードの作成

次に、コードを作成しました。まずは標準入力から与えられるデータを正しく受け取り、制約に従って分岐処理を実装しました。私は初心者なので、1つひとつの分岐を個別に作成して、動作確認をしました。この方法は、私にとっては分かりやすく、バグを見つけやすいからです。

出力にあたってはSの文字列をループさせながら、状況をカウントしていく方法にしました。ループを進めるたびに、予選通過が確定した参加者数を更新していきます。また、海外学生については、さらにB位以内という制約があるため、その条件も追加しました。

動作確認と結果

コードが完成したら、一通り動作を確認し、問題なく動いていることを確認できました。Sの文字列が成績順であるため、カウントを利用して簡単に予選通過者を判定することができました。

振り返り

正直、鬱っぽい状態で問題に取り組むのは大変でしたが、問題を解決する過程で少し楽しさを感じました。動作するコードを完成させ、小さな達成感を得られたことが、自分にとって非常にプラスでした。

これからも、こうした小さな目標を達成しながら、少しずつプログラミングスキルを磨いていきたいと思っています。

自分のコードを作ったあとには、それをChat GPTに入れてみてより効率的になったものを見て改善点を学んだりもできます。

自分が書いたコード↓

NABlist = list(map(int, input().split()))
Slist = list(input())

if ((NABlist[1]+NABlist[2])<=NABlist[0]):
    if (len(Slist) == NABlist[0]):
        pass
    else:
        print("please input correct number")
else:
    print("please input correct number")

allowed_chars = {'a', 'b', 'c'}
for char in Slist:
    if char not in allowed_chars:
        print("Please input correct word:a, b or c")
    else:
        pass

for value in NABlist:
    if 1 <= value <= 100000:
        pass
    else:
        print("please input correct number")

A = NABlist[1]
B = NABlist[2]

Acount = 0
Bcount = 0

for separate in Slist:

    if separate == ("a"):
        if (Acount+Bcount)<A+B:
            print("Yes")
            Acount += 1
        else:
            print("No")

    elif separate == ("b"):
        if (Acount+Bcount)<A+B and Bcount < B:
            print("Yes")
            Bcount += 1
        else:
            print("No")

    elif separate == ("c"):
        print("No")

Chat GPTによって修正されたコード↓

# 入力を取得
NABlist = list(map(int, input().split()))
Slist = list(input())

# 各値の取り出し
N = NABlist[0]
A = NABlist[1]
B = NABlist[2]

# 合計の参加者数のチェック
if (A + B) > N:
    print("please input correct number")
elif len(Slist) != N:
    print("please input correct number")
else:
    # 許可される文字('a', 'b', 'c')のチェック
    allowed_chars = {'a', 'b', 'c'}
    if not all(char in allowed_chars for char in Slist):
        print("Please input correct word: a, b or c")
    else:
        # A, B のカウント
        Acount = 0
        Bcount = 0
        total_count = A + B

        # 文字ごとの処理
        for separate in Slist:
            if separate == "a":
                if (Acount + Bcount) < total_count:
                    print("Yes")
                    Acount += 1
                else:
                    print("No")
            elif separate == "b":
                if (Acount + Bcount) < total_count and Bcount < B:
                    print("Yes")
                    Bcount += 1
                else:
                    print("No")
            else:  # 'c' の場合
                print("No")

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です