치춘짱베리굿나이스

[백준] 1064 본문

평행사변형

문제

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC)

이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나올 수도 있다.

만들어진 모든 사각형 중 가장 큰 둘레 길이와 가장 작은 둘레 길이의 차이를 출력하는 프로그램을 작성하시오. 만약 만들 수 있는 평행사변형이 없다면 -1을 출력한다.

입력

첫째 줄에 xA yA xB yB xC yC가 주어진다. 모두 절댓값이 5000보다 작거나 같은 정수이다.

출력

첫째 줄에 문제의 정답을 출력한다. 절대/상대 오차는 10-9까지 허용한다.

풀이

const parallel = () => {
  let input = require("fs")
    .readFileSync("/dev/stdin")
    .toString()
    .trim()
    .split(" ")
    .map(Number);
  if (
    (input[0] - input[2]) * (input[3] - input[5]) ===
    (input[2] - input[4]) * (input[1] - input[3])
  )
    console.log(-1);
  else if (
    (!(input[0] - input[2]) && !(input[2] - input[4])) ||
    (!(input[1] - input[3]) && !(input[3] - input[5]))
  )
    console.log(-1);
  else {
    let line = [
      Math.sqrt(
        Math.pow(input[0] - input[2], 2) + Math.pow(input[1] - input[3], 2)
      ),
      Math.sqrt(
        Math.pow(input[2] - input[4], 2) + Math.pow(input[3] - input[5], 2)
      ),
      Math.sqrt(
        Math.pow(input[0] - input[4], 2) + Math.pow(input[1] - input[5], 2)
      ),
    ];
    let lineMax = Math.max(
      line[0] + line[1],
      line[1] + line[2],
      line[0] + line[2]
    );
    let lineMin = Math.min(
      line[0] + line[1],
      line[1] + line[2],
      line[0] + line[2]
    );
    console.log((lineMax - lineMin) * 2);
  }
};

parallel();

반성회

  1. A, B, C가 같은 선상에 있는지 검사 → 같은 선상에 있다면 -1 출력 후 종료
  2. A, B, C가 x축 또는 y축에 평행한 같은 선상에 있는지 검사 → 같은 선상에 있다면 -1 출력 후 종료
  3. 평행사변형은 평행한 두 선 쌍의 길이가 같으므로 굳이 4번째 좌표를 구할 필요 없이 3개의 점을 가지고 모든 선의 길이의 조합 (3개) 을 구하면 된다
  4. 평행사변형의 둘레는 이웃한 두 변의 길이의 합 * 2이므로 이웃한 두 변의 길이의 합만 구하면 최소값과 최대값을 구할 수 있다
  5. 모든 경우의수 (각각 3개씩) 를 구해서 최대값과 최소값을 뽑아내고 두 값의 차이에 2를 곱하면 둘레의 차이가 된다

'Javascript + Typescript > 자바스크립트로 알고리즘풀기' 카테고리의 다른 글

[백준] 1308  (0) 2022.03.10
[백준] 1016  (0) 2022.03.10
[백준] 2583  (0) 2022.03.10
[백준] 2558  (0) 2022.03.10
[백준] 1292  (0) 2022.03.10
Comments