728x90
반응형
https://www.acmicpc.net/problem/2022
2022번: 사다리
첫째 줄에 차례대로 x, y, c에 해당하는 양의 실수 세 개가 입력된다. 수는 소수점 여섯째 자리까지 주어질 수 있으며, 3,000,000,000보다 작거나 같다.
www.acmicpc.net

문제 해결
다음과 같이 h1, h2, w, w1, w2를 정의하자.

w1:c=w:h2와 w2:c=w:h1임을 이용해서 c의 값을 h1과 h2의 값으로 나타낼 수 있다.
w=w1+w2=cwh2+cwh1=cwh1+h2h1h2
c=h1h2h1+h2
우리는 정확한 w 값을 모르기 때문에 h1과 h2도 모른다.
하지만 0≤w ≤ min(x,y)이기 때문에 이진분류를 통해서 w의 근삿값을 맞추어가며 피타고라스 정리로 h1, h2의 값을 구한다음 c를 공식을 통해 구한다음 주어진 c와 맞는지 확인하면서 만약 주어진 c값보다 크다면 w값을 늘려야한다는 것이므로 최소범위를 w로 조정하며 다시 계산하고 주어진 c값보다 작다면 w값을 줄여야한다는 것이므로 최대범위를 w로 조정하며 다시 계산을 해나가며 조절한다. 반복적으로 행하며 w의 값을 추론하도록 알고리즘을 짜야한다.
CODE
import sys
input = sys.stdin.readline
def get_c(x,y,w):
h1 = (x**2-w**2)**0.5
h2 = (y**2-w**2)**0.5
c = h1*h2/(h1+h2)
return c
if __name__=='__main__':
x, y, c = map(float, input().split()) # x, y, c의 값
s, e = 0, min(x,y) # w의 가능한 범위 s이상 e이하
res = 0
while e-s > 0.000001:
m = (s+e)/2
res = m
if get_c(x,y,m) >= c:
s = m
else:
e = m
print(res)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 1039 교환 (0) | 2023.11.14 |
---|---|
[python] 백준 3584 가장 가까운 공통 조상 (0) | 2023.11.13 |
[python] 백준 3043 장난감 탱크 (0) | 2023.11.10 |
[python] 백준 2331 반복수열 (0) | 2023.11.05 |
[python] 백준 28278 스택 2 (0) | 2023.11.04 |
댓글