택시 기하학

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 33008 14457 12650 43.559%

문제

19세기 독일 수학자 헤르만 민코프스키는 비유클리드 기하학 중 택시 기하학을 고안했다.

택시 기하학에서 두 점 T1(x1,y1), T2(x2,y2) 사이의 거리는 다음과 같이 구할 수 있다.

D(T1,T2) = x1-x2 + y1-y2

두 점 사이의 거리를 제외한 나머지 정의는 유클리드 기하학에서의 정의와 같다.

따라서 택시 기하학에서 원의 정의는 유클리드 기하학에서 원의 정의와 같다.

원: 평면 상의 어떤 점에서 거리가 일정한 점들의 집합

반지름 R이 주어졌을 때, 유클리드 기하학에서 원의 넓이와, 택시 기하학에서 원의 넓이를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 반지름 R이 주어진다. R은 10,000보다 작거나 같은 자연수이다.

출력

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

예제 입력 1 복사

1
1

예제 출력 1 복사

1
2
3.141593
2.000000

예제 입력 2 복사

1
21

예제 출력 2 복사

1
2
1385.442360
882.000000

예제 입력 3 복사

1
42

예제 출력 3 복사

1
2
5541.769441
3528.000000

sun cloud

해설

유클리드 기하학과 택시 기하학에 관한 문제입니다.

이전 문제인 직각삼각형의 문제와 이어지기도 하는데, 유클리드 기하학에서 두 점 사이의 거리는 직각삼각형에 대한 피타고리스의 정리에서 구할 수 있습니다.

image

그런데 택시 기하학에서의 두 점 사이의 거리는 문제의 설명처럼 다음과 같습니다.

image

간단하게 수를 대입해서 확인해보겠습니다.

A(1,1)라는 점과 B(6,6)라는 점이 있다고 가정하겠습니다.

image

택시 기하학에서의 정의에 따르면 6-1 + 6-1 = 10의 거리가 나옵니다.

원의 모양 또한 다르게 나타날 것 입니다.

원점으로부터 3만큼 떨어진 곳에 위치한 점들의 집합을 그려보면 다음과 같습니다.

유클리드 기하학image

좌측은 저희가 알고 있는 유클리드 기하학에 따른 원이고, 우측은 택시 기하학에 따른 원입니다.

이제 넓이는 구하는 공식을 구해서 코드를 진행하면 되겠습니다.

유클리드 기하학의 경우 파이 * 반지름의 제곱으로 구할 수 있고,

택시 기하학의 경우 그래프를 통해 2 * 반지름의 제곱으로 구할 수 있다는 것을 알 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		double r= Double.parseDouble(br.readLine());
		String u = String.format("%.6f",EuclidianGeometryCircleArea(r));
		String t = String.format("%.6f",TaxiCabGeometryCircleArea(r));
		System.out.println(u+"\n"+t);
	}
	public static double EuclidianGeometryCircleArea(double a) {
		return Math.PI*a*a;
	}
	public static double TaxiCabGeometryCircleArea(double a) {
		return 2*a*a;
	}
}

소수점은 5번째자리까지 표기하고, 오차가 0.0001까지 허용되기에 String.format()을 사용해서 진행했습니다.

1
2
3
4
5
6
7
8
9
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int r = sc.nextInt();
		System.out.printf("%f\n%f", Math.PI*r*r, (double)2*r*r);
	}
}

BOJ 카테고리 내 다른 글 보러가기

댓글남기기