AtCoder Beginner Contest 267のA~B問題を解いたので、その解説や感想などを書いていきます!
私は緑コーダーなので、同じ緑コーダーの人や茶、灰コーダーの人の参考になれば幸いです。
Python使って解いていきます!
A: Saturday
曜日が与えられるので、土曜日まであと何日かを判定する問題です。
入力が曜日の文字列なので、そのまま計算するのは少し難しそうです。
そのため、ここは愚直に分岐を作るのが一番早いかと思います。
コードはこんな感じになりました。
s = input() if s == 'Monday': print('5') elif s == 'Tuesday': print('4') elif s == 'Wednesday': print('3') elif s == 'Thursday': print('2') else: print('1')
B: Split?
ボウリングのピンの配置が与えられるので、それがスプリットかどうかを判定する問題です。
いろいろと考え方はあるとは思いますが、次のように2段構えで考えると個人的には考えやすかったです。
まず、同じ列のピン(2と8, 1と5, 3と9)はひとつにまとめる。このとき、2本とも倒れていたら空の列、1本でも立っていたら立っている列とします。
次に、1列に並んだ列があるときに、その列がスプリットを含むかを判定できるかを作ります。
前半部分は空の配列を用意して左(or 右)から順番に列にピンが立っているか判定して追加していけばよいです。
後半部分ですが、左端と右端を適当に選択したとき、その両端のピンが両方とも立っていて、かつ、その間に空の列が含まれていればスプリットであるといえます。(下図)
あとは、左端のピン・右端のピン・途中のピンの組み合わせを全通り調査して、1こでもスプリット判定できればそれでOKです。
3重ループになりますが、多く見積もっても10^3くらいの計算量なので十分ですね。
あとは、1のピンが倒れていないとスプリット判定にならないので、そこは先に判定しておきましょう。
コードはこんな感じになりました。
pins = input() ok = False if int(pins[0]) == 1: ok = False else: # 一列の配列を作る rows = [] rows.append(int(pins[6])) rows.append(int(pins[3])) rows.append(0 if int(pins[1]) == 0 and int(pins[7]) == 0 else 1) rows.append(0 if int(pins[0]) == 0 and int(pins[4]) == 0 else 1) rows.append(0 if int(pins[2]) == 0 and int(pins[8]) == 0 else 1) rows.append(int(pins[5])) rows.append(int(pins[9])) # ループしながらスプリット判定する for i in range(5): # 左端 for j in range(i+2, 7): # 右端 for k in range(i+1, j+1): # その間 if rows[i] == 1 and rows[j] == 1 and rows[k] == 0: # 両端はピンが立っていて、その間に立っていないピンがある ok = True break print('Yes' if ok else 'No')
まとめ
今回の問題は全体的にめんどくさいものが多かったように思います。
相性が悪かったのか全然解法がひらめきませんでした。
まあ、次回頑張ります。
それでは。
コメント