본문 바로가기
문제 풀이/백준

[백준] 21475번 - Треугольная рамка (Java)

by 경험의 가치 2023. 12. 4.

문제

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

 

21475번: Треугольная рамка

Входной файл содержит четыре целых числа $a$, $b$, $c$, $d$ ($1 \le a, b, c, d \le 1000$) --- длины внешних сторон рамки и ее ширину, соответственно. Гарантируетс

www.acmicpc.net

 

입력

 

출력

 

번역본

https://www.acmicpc.net/board/view/115980

 

글 읽기 - 이 문제에 대한 번역입니다. 참고하세요

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net


알고리즘

수학, 기하학

 

일단 문제에서 예시로 직각 삼각형인거마냥 주긴 했지만, 입력이 무조건 직각 삼각형이라는 이야기는 어디에도 없으므로 모든 삼각형을 통틀어서 생각해봐야한다.

 

어쨌든 기존 삼각형 프레임이 있고, d만큼 당긴 삼각형 프레임이 아래와 같이 있다고 가정해보자.

그림을 좀 대충 그리긴 했는데 이런 느낌으로 내부 삼각형 프레임이 하나 만들어진다. 그럼 두 삼각형은 무슨 관계인가? 같은 비율만큼 크기를 줄였으므로 두 삼각형은 닮음 관계가 된다. 우리는 내부 삼각형의 넓이를 알고 싶으므로, 닮음 도형의 넓이 비는 제곱 관계임을 이용하여 구하면 된다. (내부 비율)^2 : (외부 비율)^2 = (내부 삼각형 넓이) : (외부 삼각형 넓이) 이렇게 비례식을 세워서 구한다.

 

그러면, 우선 외부 삼각형 넓이는 어떻게 알 수 있는가? 우리는 세변의 길이가 주어졌으므로 "헤론의 공식"을 이용하여 삼각형 넓이를 구할 수 있다.

위와 같은 식을 그대로 대입해서 넓이를 구한다. 참고로 헤론의 공식 증명 과정은 밑에 글을 참고하길 바란다.

https://ko.wikipedia.org/wiki/%ED%97%A4%EB%A1%A0%EC%9D%98_%EA%B3%B5%EC%8B%9D

 

헤론의 공식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 삼각형 A B C {\displaystyle ABC} 의 세 각 A , B , C {\displaystyle A,B,C} 및 이들이 마주하는 변 a , b , c {\displaystyle a,b,c} 헤론의 공식은 삼각형의 세 변의 길이를 통해 넓이

ko.wikipedia.org

 

그럼 이제 우리가 알아야 할 것은 닮음 비이다. 이는 내접원을 이용하여 알 수 있다.

그림판으로 그리다보니 대충 그리긴 했는데... 어쨋든 저런 느낌이 된다. 우리는 똑같은 비율로 외부 삼각형을 줄여 내부 삼각형을 만들었으므로, 그 삼각형의 중심점은 동일할 것이다. 따라서, 닮음비는 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);
    }
}