본문 바로가기

C++

백준 3053번 택시기하학 문제에서 배운것들-택시기하학, 원주율값(π: 파이) M_PI, double과 float의 차이

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

 

3053번: 택시 기하학

문제 19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + |y1-y2| 두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다. 따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다. 원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합

www.acmicpc.net

단계별로 풀어보기 수학2의 관문 3053번 택시기하학과 마주했습니다.

일단 문제를 이해를 하지 못했습니다.

유클리드 기하학, 비유클리드 기하학인 택시 기하학.. 각각의 원의 넓이를 구하라고?!?!

 

https://m.blog.naver.com/alwaysneoi/100172516753

 

[택시 기하학] 유클리드 기하학과 택시 기하학의 차이

지금까지 우리가 배운 것은 유클리드 기하학이다 우리가 초등학교를 시작으로 중학교를 거쳐 고등학교까지 ...

blog.naver.com

유클리드 기하학에서의 원과 택시 기하학에서의 원이 다르다는것을 이해해야했습니다.

한점에서 같은 거리에 있는 점들의 집합이 원이고

유클리드 기하학에서는 중간의 방해물을 고려하지 않기 때문에 일반적으로 생각하는 구형의 원이됩니다만

택시 기하학에서는 중간의 방해물(건물)을 피해서 길로만 거리계산을 하면 다이아몬드형태의 원이됩니다.

원주율값(π: 파이) 은 반지름을 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;
}

 

오늘도 한 문제 풀며 많은 것을 배웠습니다.

반응형