https://www.acmicpc.net/problem/3199
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}')
'알고리즘 > 백준 문제 풀이' 카테고리의 다른 글
[Python] 1654번 랜선 자르기 (0) | 2022.08.28 |
---|---|
[Python] 1699번 제곱수의 합 / 17626번 Four Squares (0) | 2022.08.28 |
[Python] 2013번 선그리기 (0) | 2022.08.26 |
[Python] 21650번 Чемпионат по стрельбе (0) | 2022.08.25 |
[Python] 4411번 The Trip (0) | 2022.08.24 |