[BAEKJOON] 백준 1064: 평행사변형 (C#)

2024. 5. 31. 16:05IT/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배하는 것으로 구현하였다.