반응형
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 256 MB | 817 | 378 | 247 | 45.155% |
문제
민호와 강호가 2차원 좌표 평면 위에 있다. 민호는 점 A(Ax, Ay)에서 점 B(Bx, By)를 향해 걸어가고 있고, 강호는 점 C(Cx, Cy)에서 점 D(Dx, Dy)를 향해 걸어가고 있다. 민호와 강호는 동시에 출발하고, 민호가 점 B에 도착하는 순간 강호도 점 D에 도착한다. 또, 두 사람은 항상 일정한 속도로 걸어간다. 두 사람의 거리가 가장 가까울 때, 거리를 구하는 프로그램을 작성하시오.
두 점 (x1, y1), (x2, y2)사이의 거리는 (x2−x1)2+(y2−y1)2 이다.
입력
첫째 줄에 Ax, Ay, Bx, By, Cx, Cy, Dx, Dy가 주어진다. 입력으로 주어지는 모든 좌표는 0보다 크거나 같고, 10000보다 작거나 같은 정수이다.
출력
민호와 강호가 가장 가까웠을 때의 거리를 출력한다. 절대/상대 오차는 10-6까지 허용한다.
예제 입력 1
0 0 1 1 2 2 3 3
예제 출력 1
2.8284271247
예제 입력 2
0 0 1 1 1 0 0 1
예제 출력 2
0.0000000000
예제 입력 3
0 0 10 20 30 0 5 10
예제 출력 3
8.2416338387
예제 입력 4
5 5 10 10 7 2 20 30
예제 출력 4
2.8745554697
코드
import java.io.*;
import java.util.*;
public class p11662 {
static BufferedReader br;
static StringTokenizer st;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
st = new StringTokenizer(br.readLine());
double aX1 = Double.parseDouble(st.nextToken());
double aY1 = Double.parseDouble(st.nextToken());
double aX2 = Double.parseDouble(st.nextToken());
double aY2 = Double.parseDouble(st.nextToken());
double cX1 = Double.parseDouble(st.nextToken());
double cY1 = Double.parseDouble(st.nextToken());
double cX2 = Double.parseDouble(st.nextToken());
double cY2 = Double.parseDouble(st.nextToken());
int interval = 1000000;
double aDX = (aX2 - aX1) / interval;
double aDY = (aY2 - aY1) / interval;
double cDX = (cX2 - cX1) / interval;
double cDY = (cY2 - cY1) / interval;
double i = -1 * ((aX1 - cX1) * (aDX - cDX) + (aY1 - cY1) * (aDY - cDY)) / (Math.pow(aDX - cDX, 2) + Math.pow(aDY - cDY, 2));
if (!Double.isNaN(i) && i < interval && i > 0) {
double min = getDisatnce(aX1 + aDX * i, aY1 + aDY * i, cX1 + cDX * i, cY1 + cDY * i);
System.out.println(min);
} else {
double min1 = getDisatnce(aX1, aY1, cX1, cY1);
double min2 = getDisatnce(aX2, aY2, cX2, cY2);
System.out.println(Math.min(min1, min2));
}
}
private static double getDisatnce(double x1, double y1, double x2, double y2) {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
}
}
반응형
'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글
[ BOJ ][JAVA][11722] 가장 긴 감소하는 부분 수열 (0) | 2021.05.02 |
---|---|
[ BOJ ][JAVA][11720] 숫자의 합 (0) | 2021.05.02 |
[ BOJ ][JAVA][11660] 구간 합 구하기 5 (0) | 2021.05.02 |
[ BOJ ][JAVA][11653] 소인수분해 (0) | 2021.05.02 |
[ BOJ ][JAVA][11652] 카드 (0) | 2021.05.02 |