11664번: 선분과 점
첫째 줄에 선분과 점의 좌표 Ax, Ay, Az, Bx, By, Bz, Cx, Cy, Cz가 주어진다. 좌표는 0보다 크거나 같고, 10,000보다 작거나 같은 정수이다.
www.acmicpc.net
- 점 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 의 거리가 최소 거리
'PS > BOJ' 카테고리의 다른 글
[백준] 11404 : 플로이드 (0) | 2021.05.06 |
---|---|
[백준] 1080 : 행렬 (0) | 2021.05.05 |
[백준] 10830 : 행렬 제곱 (0) | 2021.05.02 |
[백준] 16928 : 뱀과 사다리 게임 (0) | 2021.05.01 |
[백준] 11659 : 구간 합 구하기 4 (0) | 2021.04.30 |