2024. 5. 31. 16:05ㆍIT/BaekJoon
문제 링크
https://www.acmicpc.net/problem/1064
문제
평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)
이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.
만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.
입력
첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.
출력
첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.
통과한 답안
using System;
class Program
{
static void Main()
{
int[] positions = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
int x1 = positions[0];
int y1 = positions[1];
int x2 = positions[2];
int y2 = positions[3];
int x3 = positions[4];
int y3 = positions[5];
if ((x2 - x1) * (y3 - y1) == (y2 - y1) * (x3 - x1))
{
Console.WriteLine("-1");
return;
}
double abLen = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2));
double acLen = Math.Sqrt(Math.Pow(x3 - x1, 2) + Math.Pow(y3 - y1, 2));
double bcLen = Math.Sqrt(Math.Pow(x3 - x2, 2) + Math.Pow(y3 - y2, 2));
double[] sides = {abLen + acLen, abLen + bcLen, acLen + bcLen};
double result = sides.Max() - sides.Min();
Console.WriteLine(result * 2);
}
}
점 세 개의 좌표(A(x1, y1), B(x2, y2), C(x3, y3))가 주어지고
적절한 점 D를 찾아서 네 점을 이용하여 평행사변형을 구했을 때,
이 평행사변형의 가장 큰 둘레와 가장 작은 둘레의 차이를 구하는 문제이다.
단, 평행사변형을 만들 수 없는 경우에는 -1을 출력한다.
평행사변형의 특징을 이용하는 문제로,
평행사변형이 만들어질 수 없는 조건은 세 점이 모두 일직선에 있는 경우로,
이는 세 점을 지나는 두 개의 직선을 그었을 때의 기울기로 비교할 수 있다.
A를 기준점으로 하여 두 직선 AB와 AC의 기울기를 구하면
(y2- y1) / (x2 - x1) = (y3 - y1) / (x3 - x1) 으로
이를 코드로 구현하면
if ((x2 - x1) * (y3 - y1) == (y2 - y1) * (x3 - x1))
로 표현할 수 있다.
이후에 평행사변형의 가장 큰 둘레와 가장 작은 둘레는
두 선분의 합들을 비교하여 구할 수 있는데
평행사변형 ABCD가 있다면 둘레는
AB + BC + CD + DA 이고 이는
2 * (AB + BC)로 표현할 수 있다.
따라서 abLen, acLen, bcLen의 두 선분의 합을 2배한 것이 둘레가 되는데
이들 중 가장 큰 것과 가장 작은 것의 차이를 구한 뒤에 2배하는 것으로 구현하였다.
'IT > BaekJoon' 카테고리의 다른 글
[BAEKJOON] 백준 1244: 스위치 켜고 끄기 (C#) (0) | 2024.05.31 |
---|---|
[BAEKJOON] 백준 1065: 한수 (C#) (0) | 2024.05.31 |
[BAEKJOON] 백준 2605: 이진법 시계 (C#) (0) | 2024.05.30 |
[BAEKJOON] 백준 2605: 줄 세우기 (C#) (0) | 2024.05.30 |
[BAEKJOON] 백준 2511: 카드놀이 (C#) (0) | 2024.05.30 |