AtCoder Beginner Contest 210 B問題 Python解説

ABC210 B-Bouzu Mekuri

問題はこちら

Pythonでの解法】

まず解答例を下に示します。

N = int(input())
S = input()
X = 0

for i in range(N):
  if S[i] == "1":
    X = i + 1
    break

print("Takahashi" if X % 2 != 0 else "Aoki")

1. 問題文の把握

与えられる文字列Sが何を意味しているかをまず把握する必要がありますが、端的に言うと、0と1からなる文字列Sは山札を表しています。
カードには良い悪いの2種類があり、1枚目から順に良いカードなら0悪いカードなら1として表現されます。 入力例1で言えば00101 ですので、この例の山札は良い良い悪い良い悪いの順になっているということです。
そして、「高橋君と青木君のどちらが負けるか」というのを言い換えると「どちらが先に悪いカードを食べるか」ということであり、それは「文字列Sを左から順に見ていき最初に1が出てくるのは何文字目(何番目)か?」という意味になります。あとは、これをコードに落とし込んでいくだけですので、早速具体的にコードを考えていきましょう。

2. コードを考える

(0) 標準入力
今回は非常にシンプルなデータの受け取りです。Nは整数として、Sは文字列として受け取ります。
(1) 準備
問題文の把握の最後に述べた通り、「文字列Sにおいて最初に現れる1が何番目か?」が敗者決定の判定基準となりますので、その数字を格納する変数を予め自分で用意し、その初期値を0としておきます。 (0) 標準入力と合わせて、次のようなコードとなります。

N = int(input())
S = input()
X = 0

(2) 根幹
文字列Sにおいて1が何番目に出てくるかを知りたいので、Sを一文字ずつ取り出して調べてみることにします。
そこで、for文if文を使い、一文字ずつ取り出して1かどうかを確認します。もし1であればそれが何番目かをXに記憶させます。よって、次のようなコードを書いていきます。

N = int(input())
S = input()
X = 0
#以下が新規追加分
for i in range(N):
  if S[i] == "1":
    X = i + 1
    break

このとき、1は整数ではないのでif文の条件式では"1" と書くことに注意が必要です。また、for文の繰り返し変数iには0から順に代入されていきますので、順番を表す変数Xに代入するときは1を加えることも忘れないようにしましょう。
そして、このゲームでは最初に悪いカードを食べた人が負けというルールのですので、最初の1が出たらそこで繰り返し処理は終了する必要があります。(もし、複数枚の悪いカードがあり、それらが奇数番目、偶数番目それぞれにあった場合に繰り返し処理を続けてしまうと変数Xが更新されてしまい正しい答えが得られません。)そこで、if文の中に1が出たらその時にfor文が終了するようにbreakを書いておきます。

(3) 出力
問題文より、カードを引くのは奇数番目が高橋君、偶数番目が青木君だと分かるので、Xが奇数ならTakahashi、偶数ならAokiが出力されるようにprint()を書きます。今回も解答例では三項演算子を用いています。
コードは次のようになります。

N = int(input())
S = input()
X = 0

for i in range(N):
  if S[i] == "1":
    X = i + 1
    break
#以下が新規追加分
print("Takahashi" if X % 2 != 0 else "Aoki")

以上で解答例のコードが完成しました!

3. まとめ

いかがでしたか?A問題と違い、問題文をそのままコードにはできない問題でした。「どちらが負けるか?」という問題を「文字列において最初に現れる1の順番は?」という問題に帰着できれば、B問題と言っても文法的に難しい部分は無かったのではと思います。自力でできなかった方は是非、再度チャレンジしてみてください。
今回も最後までお読みいただきありがとございました。次回の記事もお楽しみに!