문제
https://www.acmicpc.net/problem/21475
입력
출력
번역본
https://www.acmicpc.net/board/view/115980
알고리즘
수학, 기하학
일단 문제에서 예시로 직각 삼각형인거마냥 주긴 했지만, 입력이 무조건 직각 삼각형이라는 이야기는 어디에도 없으므로 모든 삼각형을 통틀어서 생각해봐야한다.
어쨌든 기존 삼각형 프레임이 있고, d만큼 당긴 삼각형 프레임이 아래와 같이 있다고 가정해보자.
그림을 좀 대충 그리긴 했는데 이런 느낌으로 내부 삼각형 프레임이 하나 만들어진다. 그럼 두 삼각형은 무슨 관계인가? 같은 비율만큼 크기를 줄였으므로 두 삼각형은 닮음 관계가 된다. 우리는 내부 삼각형의 넓이를 알고 싶으므로, 닮음 도형의 넓이 비는 제곱 관계임을 이용하여 구하면 된다. (내부 비율)^2 : (외부 비율)^2 = (내부 삼각형 넓이) : (외부 삼각형 넓이) 이렇게 비례식을 세워서 구한다.
그러면, 우선 외부 삼각형 넓이는 어떻게 알 수 있는가? 우리는 세변의 길이가 주어졌으므로 "헤론의 공식"을 이용하여 삼각형 넓이를 구할 수 있다.
위와 같은 식을 그대로 대입해서 넓이를 구한다. 참고로 헤론의 공식 증명 과정은 밑에 글을 참고하길 바란다.
https://ko.wikipedia.org/wiki/%ED%97%A4%EB%A1%A0%EC%9D%98_%EA%B3%B5%EC%8B%9D
그럼 이제 우리가 알아야 할 것은 닮음 비이다. 이는 내접원을 이용하여 알 수 있다.
그림판으로 그리다보니 대충 그리긴 했는데... 어쨋든 저런 느낌이 된다. 우리는 똑같은 비율로 외부 삼각형을 줄여 내부 삼각형을 만들었으므로, 그 삼각형의 중심점은 동일할 것이다. 따라서, 닮음비는 r : (r+d)가 된다. 그렇다면 저 r값을 어떻게 구할 것인가?
내접원의 성질을 이용하여 구할 수 있다. (외부 삼각형 넓이) = 0.5 * (d+r) * (a+b+c)이다. 이때, 우리는 외부 삼각형 넓이도 알고, d도 알고, a,b,c값도 알고 있으니 r값을 구할 수 있게 된다. 그리고 r값을 알게 되었으니 당연히 닮음비도 알게되고 내부 삼각형의 넓이도 알 수 있게 된다. 이 과정을 그대로 코드로 구현해서 제출하면 답이된다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
double a = Double.parseDouble(st.nextToken());
double b = Double.parseDouble(st.nextToken());
double c = Double.parseDouble(st.nextToken());
double d = Double.parseDouble(st.nextToken());
double s = (a+b+c)/2;
double width = Math.sqrt(s*(s-a)*(s-b)*(s-c));
double r = (2*width)/(a+b+c);
double width2 = (width*Math.pow(r-d,2))/Math.pow(r,2);
String answer = String.format("%.5f", width-width2);
System.out.println(answer);
}
}
'문제 풀이 > 백준' 카테고리의 다른 글
[백준] 9370번 - 미확인 도착지 (Java) (1) | 2023.12.04 |
---|---|
[백준] 17836번 - 공주님을 구해라! (Java) (2) | 2023.12.04 |
[백준] 2342번 - Dance Dance Revolution (Java) (1) | 2023.12.04 |
[백준] 18235번 - 지금 만나러 갑니다 (Java) (1) | 2023.12.03 |
[백준] 15311번 - 약팔기 (Java) (0) | 2023.12.02 |