문제 링크
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 |
댓글