기본 콘텐츠로 건너뛰기

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



3053번: 택시 기하학
문제 19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다. 택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다. D(T1,T2) = |x1-x2| + |y1-y2| 두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다. 따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다. 원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합
www.acmicpc.net
단계별로 풀어보기 수학2의 관문 3053번 택시기하학과 마주했습니다.
일단 문제를 이해를 하지 못했습니다.
유클리드 기하학, 비유클리드 기하학인 택시 기하학.. 각각의 원의 넓이를 구하라고?!?!



[택시 기하학] 유클리드 기하학과 택시 기하학의 차이
지금까지 우리가 배운 것은 유클리드 기하학이다 우리가 초등학교를 시작으로 중학교를 거쳐 고등학교까지 ...
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;
}

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

댓글

이 블로그의 인기 게시물

Unity(ユニティ)整理:04.左右移動 無限反復 Time.deltaTime, Time.time, Mathf.Sin()

スーパーマリオのような横スクロールケームによくでる地形があります。 空中に浮かんで左右無限反復するので ちゃんとタイミングを合わせて乗る必要がある地形です。 基本決定 ---------- 2D プロジェット作成 1.GameObject >>2D Object >> Sprite追加 2.Googleイメージ検索で”minecraft stone”キーワード、アイコンサイズのイメージを1つダウンロード 3.1で追加したSpriteに2でダウンロードしたイメージを設定 4.HierarchyのSpriteをドラックしてAssetsにドロップ(Prefabs作成)、名前を”Stone”に変更 5.HierarchyのSpriteを削除、Assetsの”Stone”をSceneにドラック&ドロップ 6.C# Scriptを”StoneMove”作成、”Stone”に追加 ---------- 具現1 ---------- float rightMax = 2.0f;    //左へ移動可能 (x)最大値 float leftMax = -2.0f;    //右へ移動可能 (x)最大値 float currentPosition;    //現在の位置(x)保存 float direction = 3.0f;    //移動速度+方向 void Start()  {       currentPosition = transform.position.x;  }  void Update()  {       currentPosition += Time.deltaTime * direction;       if (currentPosition >= rightMax)       {                direction *= -1;                currentPosition = rightMax;       }        //現在の位置(x)   右へ移動可能 (x)最大値より大きい、もしくは同じの場合       //移動速度+方向-1を掛けて反転、 現在の位置

Xcodeのc++プロジェクトでofstreamでファイル作成ができない場合の処理

macOS SieraのXcode 9.2でc++でテキストファイルを生成するプログラムを作成しました。実行するとエラーもなく、問題はなさそうですが実際にファイルが作成されません。 ----------------------- #include <fstream> using namespace std; int main(void) {     ofstream myText("Hello.txt");     myText << "Hello Text!" << endl;     myText.close();     return 0; } ----------------------- プロジェクトのソースファイルと同じパスを予想して確認してますがありません。 ファイルを検索してみても見つかりませんでした。 ----------------------- ofstream myText("Hello.txt"); ----------------------- 部分を ----------------------- ofstream myText("/Users/xxxxxx/Documents/Hello.txt"); ----------------------- の絶対パスにすると作成されました。 現在の作動パスを認識してないようでした。 stackoverflowで解決法を見つけたので整理します。 C++ Program in Xcode not outputting simple text file using outFile XcodeプロジェクトのSchemeで作業ディレクトリの設定が必要でした。 1)実行ボタン(RUN)の右側のプロジェクト名部分をクリック>>Edit Scheme 2)Run>>Options>>Working Directory   Use custom working directoryをチェックしてパス選択、設定 ちゃんと生成されました! Xcode의 c++프로젝트에서 ofstream으로 파일작성이 안