본문 바로가기

알고리즘/백준 문제 풀이

[Python] 3199번 ABCD

728x90

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

 

3199번: ABCD

정찰 부대가 지금 막 새로운 보고를 보내왔습니다. 그 보고의 내용은 바로, ABCD(Atomic Beryllium-Cesium Destroyer)라는, 이름만 들어도 소름이 끼치는 병기가 테러리스트들에게 넘어갔다는 것입니다. ABCD

www.acmicpc.net


22/08/24

 

실버 랜덤 디펜스를 하다가 만난 문제.

 

 

전형적인 기하학 문제이다.


문제 요약:

 

직사각형의 넓이를 최소화하는 문제인데, 직사각형의 각 꼭짓점은 4개의 평행선 위에 놓여야 한다.

 

각 평행선 사이의 거리는 순서대로 p, q, r이다.

 

만약 직사각형을 만들 수 없으면 0을 출력, 만들 수 있으면 그 직사각형의 최솟값을 소수점 4자리까지 출력하면 된다.


접근 방법:

 

일단, 직사각형의 각 꼭짓점은 4개의 평행선 위에 놓여야 한다는 사실에 주목했다.

 

직사각형은 모든 각이 90도 이므로, 그림을 몇 개 그려보고 관찰해보니, 직사각형을 만들 수 있는 평행선 사이의 거리에 대한 조건이 보였다.

직사각형과 평행선

저렇게 그려보니 왼쪽부터 순서대로 1, 2, 3, 4번 평행선이라고 하면, 1번과 2번 평행선 사이 거리와 3번과 4번 평행선 사이 거리가 같아야만 직사각형을 그릴 수 있다는 것을 알 수 있다.

 

다시 말해, p와 r의 값이 서로 같지 않으면 0을 출력하면 된다.

 

그리고 만들 수 있다면 그 최솟값은 무엇일까 생각하던 도중, 힌트가 큰 도움이 되었다.

예제 힌트

직사각형의 넓이가 최소가 되려면 직사각형의 (가로)*(세로)가 최소가 되어야 한다.

 

근데 힌트처럼 점 A에서 가로선을 그으면, 직사각형의 선과 가로선이 이루는 각이 생기는데, 그 각을 x라고 하자.

 

그러면 직사각형의 가로길이는 (p+q)/(cos x)가 된다.

 

마찬가지로, 직사각형의 세로 길이는 p/(sin x)가 된다.

 

두 개의 곱이 최소가 되려면, sin x * cos x 가 최대가 돼야 하므로, 이에 해당하는 x의 값은 산술-기하 평균 부등식에 의해 그 조건이 sin x = cos x가 되는 x의 값으로 좁혀지므로, 곧 45도가 된다.

 

이를 유도한다면, 직사각형의 최소 넓이는 (p+q)*q*2가 되는 것을 알 수 있다.

 

 

문제가 ps에서 요구하는 지식이 아니라 수학적인 지식을 요구하기 때문에 개인적으로 실버 3은 아닌 것 같아 실버 2로 기여했다.


 

아래는 이를 구현한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 3199번 ABCD
# 기하학
'''
접근 방법:
ABCD로 인한 피해 최소화 = 방사능으로 인한 피해 최소화 = 직사각형의 넓이 최소화
직사각형의 넓이를 최소화 하는 문제
직사각형을 각 평행선 위에서 만들어야됨.
못만들면 0을 출력, 만들 수 있으면 최소넓이 출력
최소넓이는 45도일때 최소
'''
p, q, r = map(float, input().split())
if p != r:
    print(0)
else:
    print(f'{2*(p+q)*p:.4f}')