GitHubSeob

C++ / 백준 / 2022 / 사다리 본문

Baekjoon/Silver

C++ / 백준 / 2022 / 사다리

GitHubSeob 2021. 8. 20.

문제

https://www.acmicpc.net/problem/2022

 

2022번: 사다리

첫째 줄에 차례대로 x, y, c에 해당하는 양의 실수 세 개가 입력된다. 수는 소수점 여섯째 자리까지 주어질 수 있다.

www.acmicpc.net

문제풀이

 

닮음을 이용하여 풀었다.

 

 

왼쪽 삼각형

 

오른쪽 삼각형

 

라는 식을 얻을 수 있다.

 

 

또 피타고라스 정리에 의해서

이후에 양변을 루트를 씌우면 h1, h2의 식을 구할 수 있다.

우리는 w1+w2인 값을 구해야한다.

이분탐색을 이용하여 이 값을 구한다.

w1+w2를 이분탐색의 mid값으로 두고, h1과 h2값을 구하고 h1*h2/(h1+h2)값과 c값을 비교하면서

문제에 나온 오차가 10^-3 이하로 나오도록 조건을 건다.

 

 

 

 

 

코드

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	double x = 0, y = 0, c = 0;
	cin >> x >> y >> c;
	double left = 0, right = min(x, y);
	while (right - left >= 1e-3) {
		double width = (left + right) / 2;
		double height1 = sqrt(pow(x, 2) - pow(width, 2));
		double height2 = sqrt(pow(y, 2) - pow(width, 2));
		double num = height1 * height2 / (height1 + height2);

		if (num < c)
			right = width;
		else left = width;
	}
	cout << fixed;
	cout.precision(3);
	cout << right;
}