출처 : 11662번: 민호와 강호 (acmicpc.net)
민호와 강호 성공 스페셜
시간제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 | 256 MB | 750 | 328 | 221 | 42.996% |
문제
민호와 강호가 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
[ 문제 설명 ]
이 문제는 두 점이 직선 운동을 할 때 두 직선 간의 거리를 좌표로 두면 어떤 모양을 둘 것이고 그 모양에서 가장 작은 값이 우리가 원하는 최솟값이 될 거라는 intuition이 있어야 이 문제를 이해할 수 있다.
그림으로 설명하겠다.
[ 코드 ]
def threeSearch(left, right):
while abs(right - left) > 1e-9:
left3 = (2 * left + right) / 3
right3 = (left + 2 * right) / 3
if dist(left3) > dist(right3):
left = left3
else:
right = right3
return dist(left)
def dist(t):
mx = ax * t + bx * (1 - t)
my = ay * t + by * (1 - t)
kx = cx * t + dx * (1 - t)
ky = cy * t + dy * (1 - t)
return ((kx - mx) ** 2 + (ky - my) ** 2) ** 0.5
ax, ay, bx, by, cx, cy, dx, dy = map(int, input().split())
print("%.16f" % threeSearch(0, 1)) # 비율을 1을 기준으로 했으므로
후기
약간 수학적인 사고가 필요하고, 지식이 필요한 문제
개인적으로 이런 문제를 풀면 기분은 좋지만 이런 문제는
과연 컴공의 코딩력과 관련이 있을까?라는 의문은 조금 든다.
'백준 코딩 테스트' 카테고리의 다른 글
백준 1780번 - 종이의 개수 (0) | 2021.03.01 |
---|---|
백준 11728번 - 배열 합치기 (0) | 2021.03.01 |
백준 10816번 - 숫자카드2 (0) | 2021.02.26 |
백준 2261번 - 가장 가까운 두점 (0) | 2021.02.26 |
백준 2873번 - 롤러코스터 (0) | 2021.02.26 |