by CodeJin19
1 min read

Categories

Tags

오늘의 문제는 “3053번 택시 기하학”.

원의 반지름 R이 주어지면, 이 원의 넓이와, 이 원에 내접하는 정사각형의 넓이 두 개를 계산하면 된다.

처음에는 별 생각없이 풀었었다.

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
	int r;
	double area;

	cin >> r;

	area = r * r;
	area *= 3.141592654;

	cout << fixed;
	cout.precision(5);
	cout << area << "\n";

	area = 2 * r;
	area *= r;

	cout << area << "\n";

	return 0;
}

너무 간단해서 당연히 맞을 줄 알았는데 틀렸다.

너무 간단해서 왜 틀렸는지 감도 안 잡히던 와중에 문득 든 생각이 파이값을 좀 더 정확하게 써야 할 것 같았다.

이 두 가지를 수정하면

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
	int r;
	double area;

	cin >> r;

	area = r * r;
	area *= 3.14159265358979323846;

	cout << fixed;
	cout.precision(8);
	cout << area << "\n";

	area = 2 * r;
	area *= r;

	cout << area << "\n";

	return 0;
}

정답이었다.

정답과의 오차를 0.0001까지 허용해준다고 하더라도 이보다 훨씬 더 작은 단위까지 신경써야했던 것이다.

이렇게 단순하게 풀지 않고, 좀 더 멋있게 풀려면 아래와 같이 하면 된다.

#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>

using namespace std;

int main()
{
	int r;
	double area;

	cin >> r;

	area = r * r;
	area *= M_PI;

	cout << fixed;
	cout.precision(5);
	cout << area << "\n";

	area = 2 * r;
	area *= r;

	cout << area << "\n";

	return 0;
}