본문 바로가기
  • 개발하는 곰돌이
Algorithm/BOJ

[Kotlin] 백준 1064 : 평행사변형

by 개발하는 곰돌이 2022. 11. 24.

문제 링크

 

1064번: 평행사변형

평행사변형은 평행한 두 변을 가진 사각형이다. 세 개의 서로 다른 점이 주어진다. A(xA,yA), B(xB,yB), C(xC,yC) 이때, 적절히 점 D를 찾아서 네 점으로 평행사변형을 만들면 된다. 이때, D가 여러 개 나

www.acmicpc.net



문제 해설

점 3개가 주어졌을 때 만들어지는 평행사변형 중 가장 긴 둘레와 가장 짧은 둘레 길이의 차이를 구하는 문제다.

점 3개가 주어지면 위 그림과 같이 3개의 변이 만들어지는데, 평행사변형은 마주 보는 변의 길이가 같으므로 두 변의 길이의 합에 2를 곱한 값이 둘레의 길이가 된다. 가장 큰 평행사변형의 둘레와 가장 작은 평행사변형의 둘레의 차이만 구하면 되기 때문에 3개의 변 중에 가장 긴 변의 길이에서 가장 짧은 변의 길이를 뺀 결과에 2를 곱한 값이 결과가 된다.

편의상 3개의 변이 \(a, b, c\)일 때 세 변의 길이가 \(a > b > c\)라면 가장 큰 평행사변형의 둘레는 \(2(a + b)\)가 되고, 가장 작은 평행사변형의 둘레는 \(2(b+c)\)가 된다. 두 값의 차이를 정리하면 \(2a+2b-2b-2c=2a-2c=2(a-c)\)가 된다.

 

문제의 마지막 조건에 평행사변형을 만들 수 없다면 -1을 출력하라고 명시되어 있다. 3개의 점이 주어졌을 때 평행사변형이 만들어지지 않는 경우는 3개의 변이 하나의 직선 위에 있을 때, 다시 말해 기울기가 같은 경우가 된다.


Code

import kotlin.math.pow
import kotlin.math.sqrt

fun main() = with(System.`in`.bufferedReader()) {
    val input = readLine().split(" ").map { it.toDouble() }
    val p1 = Point(input[0], input[1])
    val p2 = Point(input[2], input[3])
    val p3 = Point(input[4], input[5])
    /**
     * 기울기를 구할 때 나눗셈이 아닌 다른 직선의 기울기의 분모에 해당하는 값의
     * 곱셈을 사용한 이유는 두 점의 x가 같은 경우, 즉 분모가 0이 되는 경우의 예외를 피하기 위함
     */
    if ((p3.y - p2.y) * (p2.x - p1.x) == (p2.y - p1.y) * (p3.x - p2.x)) {
        println(-1)
        return@with
    }

    val sides = arrayOf(distance(p1, p2), distance(p1, p3), distance(p2, p3)).sortedArray()
    println((sides[2] - sides[0]) * 2)
}

fun distance(p1: Point, p2: Point) = sqrt((p1.x - p2.x).pow(2) + (p1.y - p2.y).pow(2))
class Point(val x: Double, val y: Double)

'Algorithm > BOJ' 카테고리의 다른 글

[Kotlin] 백준 1065 : 한수  (0) 2022.11.25
[Kotlin] 백준 4673 : 셀프 넘버  (1) 2022.11.25
[Kotlin] 백준 1010 : 다리 놓기  (1) 2022.11.24
[Kotlin] 백준 1094 : 막대기  (0) 2022.11.23
[Kotlin] 백준 1308 : D-Day  (0) 2022.11.23

댓글