점 C 가 선분 AB 에 수선의 발을 직접 내릴 수 있는지, 없는지에 따라서 최소 거리가 달라진다.
수선의 발을 내릴 수 있는 경우엔 해당 길이가 최소 길이가 되지만, 수선의 발이 선분 AB 바깥쪽에 떨어지는 경우에는 A 혹은 B 까지의 직접적인 거리가 최소 길이가 된다.
벡터 AB 에 C 를 사영시킨 벡터 P 를 통해서 수선의 발의 위치를 알 수 있다.
P 는 a * B 의 꼴로 나타나기 때문에, a 의 값이 0과 1 사이면 선분 AB 에, 그 외는 바깥에 떨어진다는 의미이다.
선형대수적 접근을 했지만, 문제 의도는 삼분 탐색을 통해 오차값을 줄여나가는 과정인 것 같다. 나중에 다시 풀어야겠다.
def distance(a, b):
return (sum((e1-e2)**2 for e1, e2 in zip(a,b))) ** 0.5
Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz = map(int, input().split())
Cx -= Ax
Cy -= Ay
Cz -= Az
Bx -= Ax
By -= Ay
Bz -= Az
A, B, C = (0,0,0), (Bx, By, Bz), (Cx, Cy, Cz) # A 를 원점으로 두고, B 와 C 변환
x = (Bx * Cx + By * Cy + Bz * Cz) / (Bx * Bx + By * By + Bz * Bz) # B 를 C 에 사영시킬 때 나오는 벡터의 C 에 대한 비율
# 만약 해당 벡터가 선분 AC 바깥쪽에 존재한다면
if x < 0 or x > 1:
print("{:.10f}".format(min(distance(A, C), distance(B, C)))) # A 와 C 중 가까운 점과의 거리가 최소거리
else:
print("{:.10f}".format(distance((x * Bx, x * By, x * Bz), C))) # AC 안에 존재한다면 사영시킨 벡터 P 와 C 의 거리가 최소 거리