직각삼각형

난이도

Gold 5

인증

문제

2차원 평면에 N개의 점이 주어져 있다. 이 중에서 세 점을 골랐을 때, 직각삼각형이 몇 개나 있는지를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 점의 개수 N(3 ≤ N ≤ 1,500)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 점의 x좌표와 y좌표가 빈 칸을 사이에 두고 주어진다. 좌표값은 절댓값이 1,000,000,000을 넘지 않는 정수이며, 주어지는 모든 점의 좌표는 다르다.

출력

첫째 줄에 직각삼각형의 개수를 출력한다.

예제 입력

5
-1 1
-1 0
0 0
1 0
1 1

예제 출력

7

해설 및 후기

피타고라스의 정리를 이용해 간단히 풀 수 있다. 세 점을 마치 조합처럼 뽑은 뒤, 그 점들간의 거리의 제곱을 각각 구하고, 가장 긴 값에 대해 나머지 두 값의 합과 같다면 세 점들로 이루어지는 삼각형은 직각삼각형이다.

제출 코드

import sys
from itertools import combinations
n = int(sys.stdin.readline().rstrip())
c = []
cnt = 0
def isRight(a,b,c):
    ab = ((a[0]-b[0])**2+(a[1]-b[1])**2)
    bc = ((b[0]-c[0])**2+(b[1]-c[1])**2)
    ca = ((c[0]-a[0])**2+(c[1]-a[1])**2)
    if(ab == bc+ca or bc == ab+ca or ca == ab+bc):
        return True
    else:
        return False

for i in range(n):
    c.append(list(map(int,sys.stdin.readline().rstrip().split())))
for i in range(n-2):
    for j in range(i+1,n-1):
        for k in range(j+1, n):
            if(isRight(c[i],c[j],c[k])): cnt+=1


print(cnt)