coding_test/BAEKJOON

백준 3053번 C언어 풀이

CodeJin 2021. 9. 10. 14:14

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

 

3053번: 택시 기하학

첫째 줄에는 유클리드 기하학에서 반지름이 R인 원의 넓이를, 둘째 줄에는 택시 기하학에서 반지름이 R인 원의 넓이를 출력한다. 정답과의 오차는 0.0001까지 허용한다.

www.acmicpc.net

비유클리드 기하학인 택시기하학에 관한 문제. 이 문제는 풀이가 어려운 것이 아닌 택시기하학에 관한 이해가 먼저인 문제이다.

 

백준에 올라온 설명만 가지고는 솔직히 무슨말인지 잘 몰랐다. 그래서 따로 조사하고 나서야 이해가 갔다.

 

유클리드 기하학의 좌표계에서는 두점(a1, b1)과 (a2, b2)사이의 거리는 다음과 같이 구해진다.

하지만 택시기하학에서는 다음과 같이 정의한다.

수평거리 + 수직거리인 셈이다.

 

이 문제에서는 각 기하학에서의 원의 넓이를 구하라고 한다.

 

원의 정의는 두 기하학에서 정의가 모두 같지만, 그 모양은 다르다.  우선 원의 정의를 살펴보면,

 

평면 위의 한 점에 이르는 거리가 일정한 평면 위의 점들의 집합으로 정의되는 도형

 

거리를 r이라고 두고, 위의 식에서 a2, b2를 각각 x, y로, a1, b1을 0으로 대입해보자. 그러면 각각의 기하학분야에서 정의하는 원의 방정식을 얻을 수 있을 것이다.

유클리드 기하학에서의 원
택시 기하학에서의 원

전자의 방정식은 원점을 중심으로 반지름이 r인 원의 모양이고, 후자의 경우는, 원점을 중심으로 대각선의 길이가 2r인  마름모일 것이다(또는 한 변의 길이가 sqrt(2) * r인 정사각형이라고도 볼 수 있겠다).

 

이제 이를 코드에 적용시켜 면적을 구하면 다음과 같을 것이다.

#include <stdio.h>
#define pi 3.14159265358979

int main () {
    int r;
    scanf("%d", &r);
    printf("%.6f \n", r * r * pi); // 유클리드 기하학 - 원의 넓이 : pi*(r^2)
    printf("%.6f \n", 2.0 * r * r); // 택시 기하학의 - 원의 넓이 : ((sqrt(2) * r)^2)/2 = 2*(r^2)
    return 0;
}