www.acmicpc.net/problem/11664

 

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

+ Recent posts