[Day 3-1] BOJ 2022 : 사다리

khj20006·2022년 11월 2일
post-thumbnail

다리가 4개면? 사다리 ㅋㅋㅋ....

문제

두 빌딩이 얼마나 떨어져 있을까?

해결 전략

처음에는 단순히 피타고라스 정리만을 이용해 식을 도출해내려고 했지만, 식이 너무너무 복잡해져서 포기했습니다.
O(1)O(1)만에 답을 구하는 건 불가능이라 생각해서 근삿값을 찾아가며 푸는 문제라고 생각을 해봤습니다.

구하려는 값을 hh로 두고 이를 근삿값으로 사용합니다. 초기에는 00min(x,y)min(x,y)의 중간으로 설정합니다.

왼쪽 집과 길이 yy인 선분이 닿는 바닥 지점을 원점으로 하여 두 점선이 이루는 직선의 방정식을 각각 구하고,
그들의 교점의 yy좌표와 cc값을 비교합니다.

만약 cc보다 크다면, hh가 더 길어져야 yy좌표가 점점 아래로 내려올 것이므로 구간 이등분 후 오른쪽 구간에 대하여 탐색을 계속합니다.
만약 cc보다 작다면, 왼쪽 구간에 대하여 탐색합니다.
만약 cc와의 오차가 문제에서 요구하는 만큼 충분히 작다면, 즉 거의 같다면, hh가 답이 됩니다.

코드

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

int main() {
	double a, b, c;
	cin >> a >> b >> c;
	double s = 0, e = min(a, b), h = (s + e) / 2;
	double beta = sqrt(b * b - h * h) * sqrt(a * a - h * h) / (sqrt(b * b - h * h) + sqrt(a * a - h * h));
	while (abs(beta - c) > 0.00001) {
		if (beta > c)	s = h;
		else if (beta < c)	e = h;
		h = (s + e) / 2;
		beta = sqrt(b * b - h * h) * sqrt(a * a - h * h) / (sqrt(b * b - h * h) + sqrt(a * a - h * h));
	}
	cout.setf(ios::fixed);
	cout.precision(3);
	cout << h;
}

회고

처음에 삽질한 흔적... 문제를 풀 때 발상의 전환을 잘 해야 겠다고 느꼈습니다..

profile
PS 및 알고리즘 공부, 개발 등 잡다한 코딩 관련 블로그

0개의 댓글