Loading [MathJax]/jax/output/CommonHTML/jax.js
본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 2022 사다리

by Alan_Kim 2023. 11. 12.
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:h2w2:c=w:h1임을 이용해서 c의 값을 h1h2의 값으로 나타낼 수 있다.

w=w1+w2=cwh2+cwh1=cwh1+h2h1h2

c=h1h2h1+h2

우리는 정확한 w 값을 모르기 때문에 h1h2도 모른다.

하지만 0≤wmin(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
반응형

댓글