
https://www.acmicpc.net/problem/2022
[English Translation available through pressing 한국어 button and checking English]
해당 문제는 Binary Search를 이용하여 오차 범위 이내에서 두 빌딩 사이의 거리를 구하는 문제이다.
먼저, 해당 문제를 diagram으로 나타내보겠다.

x,y,c의 값은 문제와 같게 고정된 값으로 정해진다.
x_h란 x를 빗변으로 갖는 삼각형의 높이, y_h는 y를 빗변으로 갖는 삼각형의 높이로 정의하였다.
mid는 두 삼각형의 공통 밑변으로 정의하였다.
mid의 값이 커지면 빗변의 길이가 고정되어 있기 때문에, x_h와 y_h의 값이 작아진다.
mid의 값이 작아지면, x_h와 y_h의 값이 커질 것이다.
따라서, 우리는 삼각형의 높이들와 c의 비율관계를 이용하여 계산을 진행해볼 것이다.

해당 그림을 보면, x_h와 c의 비율, y_h와 c의 비율을 이용하여 mid의 두 길이를 나타낼 수 있다.
각각 x_h, y_h를 높이로 갖는 삼각형과 c를 높이로 갖는 삼각형의 닮음 관계를 가지고 있기 때문이다.
따라서 높이가 c일때 교점을 갖기 위해서는, c/x_h 와 c/y_h를 더했을 때 1이 나오면 된다.
만약 값이 c/x_h와 c/y_h의 합이 1보다 크다면, x_h와 y_h의 값이 너무 작게 정의된 것이기 때문에, mid의 값을 키우는 식으로 유도한다. 이와 반대로 x_h와 y_h의 합이 1보다 작다면, x_h와 y_h의 값이 너무 큰 것이므로, mid의 값을 줄인다.
x,y,c=map(float,input().split())
left=0
right=(min(x,y)**2-c**2)**0.5
while left<=right:
mid=(left+right)/2
xheight=(x**2-mid**2)**0.5
yheight=(y**2-mid**2)**0.5
val=c/xheight+c/yheight
if 0.999<val<1.001:
print(mid)
break
if val>1:
right=mid
else:
left=mid
그러나 이 문제는 스페셜 저지로, 10^-3의 오차를 허용한다. 그러므로 우리가 구한 공식을 통해서 구한 mid의 값이 10^-3의 범위 내에 들어오면 정답으로 설정하고 break한다.
'Computer Science > Algorithm' 카테고리의 다른 글
[Python 3] BOJ 12931 두 배 더하기 (0) | 2024.10.07 |
---|---|
[Python 3] BOJ 11438 LCA 2 (+Binary Lifting) (0) | 2024.10.05 |
[C++] BOJ 4969: 월요일-토요일 (1) | 2024.09.30 |
[C++] BOJ 2343 기타 레슨 (1) | 2024.09.29 |
[Java] BOJ 2075: N번째 큰 수 (1) | 2024.09.28 |