[백준] 2022 사다리
이분탐색 넘 좋다 ㅠㅠㅠ 뭔가 효율적으로 노가다 시키는 느낌!!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main{
static double ip(String s){ return Double.parseDouble(s); };
static double x;
static double y;
// 주어진 x,y,d를 기반으로 두 사다리의 교점에서의 높이값을 반환하는 함수
static double getC(double d) {
double a = Math.sqrt(x*x-d*d);
double b = Math.sqrt(y*y-d*d);
return (a*b)/(a+b);
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
x = ip(st.nextToken());
y = ip(st.nextToken());
double c = ip(st.nextToken());
// 둘 중 큰 쪽을 x로 넣어주려고 한다
if(x < y) {
double temp = x;
x = y;
y = temp;
}
// d의 최솟값으로 0, 최댓값으로 y를 준다
double l = 0;
double r = y;
while(true){
// l,r의 평균값을 d로 잡는다
double d = (l+r)/2;
// 해당 d값에서의 교점에서의 높이를 알아낸다
double myC = getC(d);
// 주어진 c값과의 차이가 0.001 미만이면 종료
if(Math.abs(myC - c) <= 0.001) {
System.out.println(d);
return;
}
// 구한값이 c보다 크면 d가 좁다는 얘기
if(myC > c) {
l = d;
}else { // 반대면 d가 너무 크다는 얘기
r = d;
}
}
}
}
Comments