문제
평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)
이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.
만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.
입력
첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.
출력
첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.
💡 평행사변형을 만드는 세 가지 경우
세 점 A, B, C 중 두 점을 이용해 벡터를 만들고, 나머지 한 점을 기준으로 대칭 이동하면 평행사변형을 만들 수 있어요.
가능한 3가지 경우:
- 평행사변형이 A, B, A+(C-B)
- 평행사변형이 A, C, A+(B-C)
- 평행사변형이 B, C, B+(A-C)
각 경우에서 둘레는 두 변의 길이 합 × 2입니다.
ax, ay, bx, by, cx, cy = map(int, input().split())
#세 점이 일직선인지 확인
if ((ax-bx)*(ay-cy)==(ay-by)*(ax-cx)):
print(-1.0)
exit(0)
ab_length = ((ax-bx)**2 + (ay-by)**2)**0.5
ac_length = ((ax-cx)**2 + (ay-cy)**2)**0.5
bc_length = ((bx-cx)**2 + (by-cy)**2)**0.5
length = [ab_length+ac_length, ab_length+bc_length, ac_length+bc_length]
result = max(length) - min(length)
print(2*result)
두 벡터가 일직선(=평행)인지 판별하려면?
2차원 벡터에서 평행 여부는 '외적(cross product)'이 0인지로 확인할 수 있어.
외적 공식 (2D): AB×AC=(bx−ax)∗(cy−ay)−(by−ay)∗(cx−ax)
이 값이 0이면 두 벡터는 같은 방향이거나 반대 방향 = 평행 = 세 점은 일직선!
'Coding Study > BOJ' 카테고리의 다른 글
| [백준]🥈2941번 파이썬 _ 크로아티아 알파벳 (0) | 2025.10.17 |
|---|---|
| [백준]🥉1333번 파이썬 _ 부재중 전화 (0) | 2025.04.18 |
| [백준]🥈1417 : 국회의원 선거 (0) | 2025.04.17 |
| [백준]🥉1296 : 팀 이름 정하기 (0) | 2025.04.17 |
| [백준]🥈1384 : 메시지 (0) | 2025.04.16 |