Pythonで解くAtCoder(ABC175:B)
こんにちは、クルトンです!
この記事では
AtCoderの「AtCoder Beginner Contest 175」のB問題をPythonを使って解説します。
問題のリンクを載せておきます。
今回必要な知識
- 1行に複数の数字の入力があるときの受け取り方
- for文
- set
入力の受け取り方や、for文の使い方、setの使い方は下の記事で解説しています。
入力の受け取り方
1行に複数の数字の入力があるときの受け取り方
list(map(int,input().split()))
今回の場合は
L = list(map(int,input().split()))
とすることで入力を受け取れます。
解法
今回はNが小さいので、3本の棒を選ぶ方法を全通り調べて、そのうち条件を満たすものが何通りあるかを数えればよいでしょう。
for文の3重ループを使うと、3本の棒を選ぶ方法を全通り調べることができます。
for i in range(N-2): for j in range(i+1, N-1): for k in range(j+1, N): (L[i], L[j], L[k]を使った処理)
ではここからは条件をどのようにコードに変換するかについて考えましょう。
まずという条件ですが、これはset文を使うことで表せます。
len(set([L[i], L[j], L[k]])) == 3
より一般化すると、「リストLの要素がすべて異なる」という条件は
len(L) == len(set([L[i], L[j], L[k]]))
と表せます。
この条件式は便利なので覚えておくとよいでしょう。
次にという条件をコードに変換します。
ここで、三角形の3辺をとし、そのうち一番長い辺をとすると、三角形の存在条件は
となります。
また、これをさらに式変形すると
となり、条件式は
となります。
よって今回は
2 * max([L[i], L[j], L[k]]) < sum([L[i], L[j], L[k]])
と表せます。
(※前もってLをソートしておくとが常に最大になるのでより簡潔に書くことができます。しかし、いきなり最初にソートするとなぜソートするのかが分かりにくいため、ソートしない解法について書きました。)
よって、0を代入した変数を用意しておき、上の条件式を満たすが出てくるたびに1を足していけば、最終的にが答えとなります。
このような回数を数えるための変数を「カウンター」と呼びます。
以下にサンプルコードを載せておきます
まとめ
今回は
- すべてのパターンを調べる(全探索)
- 条件式をコードに直す
という問題でした。
「リストLの要素がすべて異なる」という条件の言い換えはサラッとできるようになっておきましょう!
ではまたお会いしましょう!さようなら~