見出し画像

AtCoder Beginner Contest 170を見直す(その1)

全体の感想

一応C問題までは解けたけど、Bも効率の悪いやり方をしてしまった。C問題は完全に勘違いして別の回答を求めるコードを実装してしまった。多分疲れていたというのも関係ありそうではあるが、まぁ、こういうこともあるということで。

A - Five Variables

[1 2 3 4 5]という入力が与えられるがそのうち一つが0に変換されているので、どれが変換されているかを求める問題。
例:入力[1 2 0 4 5]→出力[3]

以下のように解答

x_list = list(map(int, input().split()))
for i, num in enumerate(x_list):
   if num == 0:
       print(i+1)
       break

単純に「0」を探して、添字に+1して返す方法です。解説見ると以下の解き方がちゃんと問題を理解してる感じでいいですね。

print(15 - sum(list(map(int, input().split()))))

これは1~5の合計「15」から、与えられた数字の合計を引いてどの数字が「0」に変換されているか求めています。入力が「5つの数字」で固定されているので、「sum関数」を使っても問題はないですし。こういった解答がパッと出るようになりたいところです。

B - Crane and Turtle

所謂「鶴亀算」をモチーフにした問題で、動物の総数「X」と足の総数「Y」が与えられるので、その状態が成り立つ鶴(足2本)と亀(足4本)の組み合わせが存在するか判定すれば良い。

以下のように解答しました。

X, Y = map(int, input().split())
turu_kame = []

if Y%2 == 0:#①
   for i in range(Y//4+1):#②
       turu_kame.append(int(i+(Y-i*4)/2))
print("Yes" if X in turu_kame else "No")#③

公式の解答とは違ったので、一応解説しておきます。
①まず、最初に鶴と亀の足の数は偶数であるため、足の数が奇数の場合は成立しないのでメインの処理を行わないようにしました。

②足の数から取りうる動物数のパターンをリストに格納しています。足の数が20の場合は、亀の数は20/4=5から「0〜5」の範囲なので、その場合の動物の数、例えば亀が「0」の場合は20/2=10より鶴が「10」匹なので10を格納といった感じ。

③取りうる動物数のパターンにXが入っているか確認し解答しています。

また、公式の解説によると以下でも解答可能なようです。

X, Y = map(int, input().split())
print("Yes" if 2*X <= Y <= 4*X and Y%2 == 0 else "No")

なぜこれで解答可能かの詳細は以下のPDFを参照ください。まぁ、全部ツルだった場合で足が2X、全部亀だった場合で足が4Xになるのは判るので、足の数がその範囲内でかつ偶数ならOKってのは出てきそうですが、問題解いてる時に出てこねぇな。という感想です。


この記事が気に入ったらサポートをしてみませんか?