반응형
    
    
    
  11662번: 민호와 강호
민호와 강호가 2차원 좌표 평면 위에 있다. 민호는 점 A(Ax, Ay)에서 점 B(Bx, By)를 향해 걸어가고 있고, 강호는 점 C(Cx, Cy)에서 점 D(Dx, Dy)를 향해 걸어가고 있다. 민호와 강호는 동시에 출발하고, 민
www.acmicpc.net
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 | 
|---|---|---|---|---|---|
| 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 |