※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1798번 문제인 원뿔좌표계상의 거리이다.
문제는 아래 링크를 확인하자.
1798번: 원뿔좌표계상의 거리
원뿔 하나가 평면 z=0에 반지름 r인 밑면을 두고 놓여 있다. 밑면의 중심은 (0,0,0) 이며, 원뿔의 꼭대기는 (0,0,h)에 위치해 있다. 즉, 원뿔의 높이는 h이다. 원뿔상의 점의 위치는 원뿔좌표계에서 다
www.acmicpc.net
중학교 수학교과서의 도형단원을 떠올려보자.
원뿔 위를 따라 움직일 때 두 점 사이의 최단거리를 구하는 방법은 원뿔의 전개도 위에서 두 점을 직선으로 잇는 것이었다.
원뿔 위에서는 A(<180도)의 각도 차이를 가진 두 점을 입력받았을 때, 전개도 위에서의 두 점의 각도 차이와의 비율은 원뿔의 밑면의 둘레와 원뿔의 옆면의 전개도의 반지름이 이루는 비율과 같다는 것을 기억한다면 이 문제는 어렵지 않게 풀 수 있다. 남은 것은 d1, d2와 각도를 이용해 (제 2) 코사인 법칙을 이용하는 것 뿐이기 때문이다.
stl 라이브러리의 cmath 헤더를 import하면 원주율값이나(M_PI), cos함수(cos), 제곱근(sqrt) 등을 전부 사용할 수 있어 위와 같은 수학식을 계산하는 것은 어렵지 않다.
cout<<std::fixed를 쓰고 cout.precision(2)를 하면 출력 소수점자리수를 2자리로 고정할 수 있게 된다
아래는 제출한 소스코드이다.
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using std::cin;
using std::cout;
using std::cos;
using std::min;
using std::abs;
using std::sqrt;
void dist(double r, double h, double d1, double A1, double d2, double A2) {
double angle = min(abs(A1-A2),360-abs(A1-A2))*M_PI*r/sqrt(r*r+h*h)/180;
cout << sqrt(d1 * d1 + d2 * d2 - 2 * d1 * d2 * cos(angle)) << '\n';
}
int main()
{
cout << std::fixed;
cout.precision(2);
double r, h, d1, A1, d2, A2;
while (cin >> r >> h >> d1 >> A1 >> d2 >> A2) {
dist(r, h, d1, A1, d2, A2);
}
return 0;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 17528 // C++] Two Machines (0) | 2021.03.12 |
---|---|
[BOJ 1991 // C++] 트리 순회 (0) | 2021.03.11 |
[BOJ 1406 // C++] 에디터 (0) | 2021.03.09 |
[BOJ 9093 // C++] 단어 뒤집기 (0) | 2021.03.08 |
[BOJ 15678 // C++] 연세워터파크 (0) | 2021.03.07 |