🔗 백준 1064 문제 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까지 허용한다.
풀이
일단.. 수학은 워낙 잘 모르기에 천천히 하나씩 TODO 리스트를 적어갔다.
1. 평행사변형을 만들 수 없는 경우에는 -1을 출력
- 3개의 점이 일직선 상에 위치한 경우 (즉, 직선의 기울기가 같은 경우)
2. 좌표를 저장할 배열이 필요할것같다
3. 배열에 저장된 3개의 값 중, 2개를 뽑아 더한 후 ×2를 한 것이 평행사변형의 둘레 길이 중 하나이다
더보기
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
Location[] arr = new Location[3];
double[] len = new double[3];
for(int i = 0; i < 3; i++){
arr[i] = new Location(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
if((arr[1].y - arr[0].y) * (arr[2].x - arr[1].x)
== (arr[1].x - arr[0].x) * (arr[2].y - arr[1].y)) System.out.println(-1);
else {
double min = Double.MAX_VALUE, max = Double.MIN_VALUE;
for (int j = 0; j < 3; j++) {
len[j] = Math.sqrt(Math.pow(arr[j].x - arr[(j + 1) % 3].x, 2)
+ Math.pow(arr[j].y - arr[(j + 1) % 3].y, 2));
}
for(int i = 0; i < 3; i++) {
double sum = 0;
sum += len[i];
sum += len[(i + 1) % 3];
if (sum > max) max = sum;
if (sum < min) min = sum;
}
System.out.println(2 * max - 2 * min);
}
}
static class Location {
int x,y;
public Location(int x, int y) {
this.x = x; this.y = y;
}
}
}
'Algorithm' 카테고리의 다른 글
[BaekJoon] 1018 체스판 다시 칠하기 JAVA (2) | 2022.12.28 |
---|---|
[BaekJoon] 1181 단어 정렬 JAVA (0) | 2022.12.23 |
[BaekJoon] 2034 반음 JAVA (0) | 2022.12.21 |
[BaekJoon] 1542 세준세비 JAVA (0) | 2022.12.20 |
[BaekJoon] 1032 명령프롬프트 JAVA (0) | 2022.12.20 |