def get_c(x, y, width) :
h1 = (x**2 - width**2)**0.5
h2 = (y**2 - width**2)**0.5
c = h1 * h2 / (h1 + h2)
return c
def BOJ2022() :
x, y, c = map(float, input().split())
start, end = 0, min(x,y)
res = 0
while (end - start) > 0.000001 :
width = (start + end) / 2
res = width
if get_c(x, y, width) >= c : # c를 구했는데 기존의 c보다 같거나 크면 w값을 키워주어서 h1, h2의 값을 작게 해주어야 한다.
start = width
else :
end = width
print(res)
BOJ2022()
접근방법 :
1. 이 문제는 첨부된 이미지와 같은 수식이 필요하다
2. c에 대한 계산식을 구하고 계산해낸 값과 입력받은 c값의 비교로 width에 접근을 할것이다.
3. width는 x,y중 작은값보다 클수 없고 0보다 작을수 없다. 결국 그 범위 사이에 있으므로 이를 이분 탐색의 개념으로 접근할 것이다.
4. 이미지내의 수식을 이용하여 width를 범위내에서 계속 바꿔주며 값을 넣어주면서 답을 구하도록 짜주었다.
5. 문제에 오차범위가 있어서 그것보다 작은 값을 자체 오차범위로 설정해주어 계속 탐색하게 해주었다.
장애물 이였던것 :
1. 결국 풀지 못했고 다른 분들의 풀이를 참조하였습니다.
2. 이분탐색의 개념이 아직 익숙치 않아서 문제풀이시에 잘 떠올리지 못하고 있는것 같습니다
3. 계산해낸 c와 입력받은 c값의 비교에서 익숙치 않은 개념이 있었는데 계산해낸 값이 더 클경우 계산해낸 값의 크기를 줄여주어 c와 같아지게끔 해주어야 한다.
따라서 start=width 값을 주어서 width(width = (start + end) / 2)가 커질수 있게 하여 h1, h2의 값 자체를 줄여주었다.
https://www.acmicpc.net/problem/2022
2022번: 사다리
첫째 줄에 차례대로 x, y, c에 해당하는 양의 실수 세 개가 입력된다. 수는 소수점 여섯째 자리까지 주어질 수 있으며, 3,000,000,000보다 작거나 같다.
www.acmicpc.net
출처:
'알고리즘' 카테고리의 다른 글
연구소[백준14502] - python (0) | 2021.12.26 |
---|---|
LCS2 [백준 9252] - python (0) | 2021.12.25 |
후위 표기식 2[백준 1935] - python (0) | 2021.12.22 |
다각형의 면적 [백준 2166] - python (0) | 2021.12.21 |
가장 긴 증가하는 부분 수열 4 [백준 14002] - python (0) | 2021.12.20 |