ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC224 C - Triangle?【Python解答例】

AtCoder Beginner Contest224のA とB問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 224 - AtCoder



AtCoder Beginner Contest224 C - Triangle?

C - Triangle?

問題文

xy 平面上に 1 から N までの番号が付いた N 個の点があります。
点 i は座標 (X i​ ,Y i​ ) にあり、相異なる 2 点は異なる位置に存在します。
この N 点から 3 点を選ぶとき、選ばれた 3 点を線分で結んだ図形が正の面積を持つ三角形になるような点の選び方の総数を求めてください。

制約

・入力は全て整数である
・3≤N≤300
・−10 9 ≤X i​ ,Y i​ ≤10 ^9
・i≠j ならば (X i​ ,Y i​ )≠(X j​ ,Y j​ )

解答例

n = int(input())

X = []
Y = []
for i in range(n):
    x, y = map(int,input().split())
    X.append(x)
    Y.append(y)

ans = 0
for i in range(n-2):
    for j in range(i,n-1):
        for k in range(j,n):
            tmp = (X[i]-X[k])*(Y[j]-Y[k]) - (X[j]-X[k])*(Y[i]-Y[k])
            if tmp != 0:
                ans += 1

print(ans)

解説

N点から3点を選んで三角形をつくるとき、正の面積を持つ三角形が何個あるか答える問題です。

3点の選び方は全探索して、正の面積(=面積が0でない)の三角形の数を数えました。

こちらの記事から、座標平面上の三角形の面積は1/2|(x1-x3)(y2-y3)-(x2-x3)(y1-y3)|で求まります。

つまり、|(x1-x3)(y2-y3)-(x2-x3)(y1-y3)|が0でない組み合わせの数をansで数えて、ループを抜けたあとにansを出力すればOKでした。



ABC224の関連記事はこちら
ebisuke33.hatenablog.com