1711번: 직각삼각형
첫째 줄에 점의 개수 N(3 ≤ N ≤ 1,500)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 점의 x좌표와 y좌표가 빈 칸을 사이에 두고 주어진다. 좌표값은 절댓값이 1,000,000,000을 넘지 않는 정수이며, 주
www.acmicpc.net
문제
2차원 평면에 N개의 점이 주어져 있다. 이 중에서 세 점을 골랐을 때, 직각삼각형이 몇 개나 있는지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N(3 ≤ N ≤ 1,500)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 점의 x좌표와 y좌표가 빈 칸을 사이에 두고 주어진다. 좌표값은 절댓값이 1,000,000,000을 넘지 않는 정수이며, 주어지는 모든 점의 좌표는 다르다.
출력
첫째 줄에 직각삼각형의 개수를 출력한다.
코드
n = int(input())
dots = []
for _ in range(n):
x, y = map(int, input().split())
dots.append((x, y))
# 선분 ab의 길이 ^ 2
def length(a, b):
return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2
# 직각삼각형인지
def chk(a, b, c):
ab = length(a, b)
bc = length(b, c)
ca = length(a, c)
# a가 직각
if ab + ca == bc:
return True
# b가 직각
elif ab + bc == ca:
return True
# c가 직각
elif ca + bc == ab:
return True
return False
ans = 0
for i in range(n-2):
for j in range(i+1, n-1):
for k in range(j+1, n):
if chk(dots[i], dots[j], dots[k]):
ans += 1
print(ans)
Python3로는 시간 초과 발생
PyPy3로 통과 가능
처음에는 itertools 라이브러리의 combinations를 이용하여 dots에서 3개를 뽑는 조합을 만들어서 했는데 Python3로는 물론이고 PyPy3에서도 시간 초과가 발생했다. 그래서 3중 for문으로 변경했더니 PyPy3에서는 간신히 통과...
'문제풀이 > 수학' 카테고리의 다른 글
[Python/파이썬] 백준 13908번 비밀번호 (0) | 2023.07.23 |
---|---|
[Python/파이썬] 백준 16938번 캠프 준비 (0) | 2023.07.11 |
[Python/파이썬] 백준 9655번 돌 게임 (0) | 2023.02.09 |
[Python/파이썬] 백준 2748번 피보나치 수 2 (0) | 2023.02.09 |
[Python/파이썬] 백준 1747번 소수&팰린드롬 (0) | 2023.02.06 |
1711번: 직각삼각형
첫째 줄에 점의 개수 N(3 ≤ N ≤ 1,500)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 점의 x좌표와 y좌표가 빈 칸을 사이에 두고 주어진다. 좌표값은 절댓값이 1,000,000,000을 넘지 않는 정수이며, 주
www.acmicpc.net
문제
2차원 평면에 N개의 점이 주어져 있다. 이 중에서 세 점을 골랐을 때, 직각삼각형이 몇 개나 있는지를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 점의 개수 N(3 ≤ N ≤ 1,500)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 점의 x좌표와 y좌표가 빈 칸을 사이에 두고 주어진다. 좌표값은 절댓값이 1,000,000,000을 넘지 않는 정수이며, 주어지는 모든 점의 좌표는 다르다.
출력
첫째 줄에 직각삼각형의 개수를 출력한다.
코드
n = int(input()) dots = [] for _ in range(n): x, y = map(int, input().split()) dots.append((x, y)) # 선분 ab의 길이 ^ 2 def length(a, b): return (a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2 # 직각삼각형인지 def chk(a, b, c): ab = length(a, b) bc = length(b, c) ca = length(a, c) # a가 직각 if ab + ca == bc: return True # b가 직각 elif ab + bc == ca: return True # c가 직각 elif ca + bc == ab: return True return False ans = 0 for i in range(n-2): for j in range(i+1, n-1): for k in range(j+1, n): if chk(dots[i], dots[j], dots[k]): ans += 1 print(ans)
Python3로는 시간 초과 발생
PyPy3로 통과 가능
처음에는 itertools 라이브러리의 combinations를 이용하여 dots에서 3개를 뽑는 조합을 만들어서 했는데 Python3로는 물론이고 PyPy3에서도 시간 초과가 발생했다. 그래서 3중 for문으로 변경했더니 PyPy3에서는 간신히 통과...
'문제풀이 > 수학' 카테고리의 다른 글
[Python/파이썬] 백준 13908번 비밀번호 (0) | 2023.07.23 |
---|---|
[Python/파이썬] 백준 16938번 캠프 준비 (0) | 2023.07.11 |
[Python/파이썬] 백준 9655번 돌 게임 (0) | 2023.02.09 |
[Python/파이썬] 백준 2748번 피보나치 수 2 (0) | 2023.02.09 |
[Python/파이썬] 백준 1747번 소수&팰린드롬 (0) | 2023.02.06 |