https://www.acmicpc.net/problem/3053
단계별로 풀어보기 수학2의 관문 3053번 택시기하학과 마주했습니다.
일단 문제를 이해를 하지 못했습니다.
유클리드 기하학, 비유클리드 기하학인 택시 기하학.. 각각의 원의 넓이를 구하라고?!?!
https://m.blog.naver.com/alwaysneoi/100172516753
유클리드 기하학에서의 원과 택시 기하학에서의 원이 다르다는것을 이해해야했습니다.
한점에서 같은 거리에 있는 점들의 집합이 원이고
유클리드 기하학에서는 중간의 방해물을 고려하지 않기 때문에 일반적으로 생각하는 구형의 원이됩니다만
택시 기하학에서는 중간의 방해물(건물)을 피해서 길로만 거리계산을 하면 다이아몬드형태의 원이됩니다.
원주율값(π: 파이) 은 반지름을 R이라고 했을때 유클리드 기하학은
π*R*R
택시 기하학은
2*R*R
이 됩니다.
이제 계산만 하면 됩니다.
"정답과의 오차는 0.0001까지 허용한다"라는 문구가 있습니다.
단영히 원주율값(π: 파이) 을 산수계산하듯이 3.14로 하면 안되겠네요.
C++에서 원주율값(π: 파이)을 얻는 방법을 조사해봅니다.
#include <cmath> 후에 M_PI로 값을 얻는다고 하는데 실제해보니 "M_PI가 정의 되지 않았다"는 에러가 발생합니다.
#include <cmath> 전에 #define _USE_MATH_DEFINES 의 추가가 필요합니다.
뭔가 M_PI에 값을 넣는 특별한 처리가 있는가 했더니
#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED)
..
#define M_PI 3.14159265358979323846
..
#endif
의 고정값이 설정되어 있습니다.
#define _USE_MATH_DEFINES
#include <cmath>
보다는 그냥
#define M_PI 3.14159265358979323846
가 직관적입니다만 매번 외워서 쓸 수는 없겠네요.
코드를 작성해서 채점을 했는데 실패가 되었습니다.
계산 결과를 float에 담은게 문제였습니다.
double과 float의 차이를 배웁니다.
double은 15-16개의 10진수를 float는 7개의 10진수를 표현합니다.
고로 double은 float보다 2배정도 더 정확합니다.
M_PI 3.14159265358979323846 의 자리수이니 double을 써야했습니다.
#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
using namespace std;
int main(void)
{
int R;
cin >> R;
double U,T;
U=M_PI * R * R;
T=2 * R * R;
cout <<fixed;
cout.precision(6);
cout << U << endl << T << endl;
return 0;
}
오늘도 한 문제 풀며 많은 것을 배웠습니다.
'C++' 카테고리의 다른 글
맥(macOS) Big Sur의 Xcode 12.5에서 SFML을 사용하기 위한 설정 (0) | 2021.05.07 |
---|---|
데이터형의 최대값과 최소값 정리입니다. (0) | 2019.08.21 |
구조체(Struct)혹은 클래스(Class)를 정렬해보자. (0) | 2019.08.09 |
cin과 getline을 같이 사용할때 cin.ignore()이 필요한 이유 기록 (4) | 2019.07.09 |
기약분수, 서로소, 최대공약수(GCD), 유클리드 호제법, 추가) 최소공배수(LCM) (0) | 2019.06.13 |