본문 바로가기
Baekjoon Algorithm/python

[Python] BAEKJOON 3053번 택시기하학

by SeolLab. 2022. 12. 23.
728x90

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

 

3053번: 택시 기하학

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

www.acmicpc.net

 

문제

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 

3.141593
2.000000

예제 입력 2 

21

예제 출력 2 

1385.442360
882.000000

예제 입력 3 

42

예제 출력 3 

5541.769441
3528.000000

 

 

바깥 원이 유클리드 원, 안쪽 마름모가 택시 기하학의 원

 

 

sol1) 

%0.6f는 float형으로 6번째자리까지 반올림한 값을 출력하도록 한다. 

# 택시 기하학 3053번
import math
R = int(input())
print("%0.6f"%(R*R*math.pi))
print("%0.6f"%(2*(R**2)))

83B길이, 36ms로 통과했다. 하지만 만족할 수 없다.

 

sol2) 

어차피 6번째자리까지 출력하면 되고, 문제 조건에 따라 정답과의 오차는 0.0001까지 허용된다. 이를 역이용하면, pi를 math 라이브러리에서 사용하지 않고 임의의 유한소수 값으로 바꿀 수 있다. 

 

 starjh2001님의 코드를 참고했고, 소숫점 몇번째 자리까지 나타내면 되는지 계속 시도하는 과정에서 계속 '실패했습니다.'가 연발됐다. 덕분에 오차가 0.0001까지 허용되는 게 아님을 알았고, 소숫점 6번째자리 이상으로 출력되더라도 통과됨을 알았다. 따라서 3.1415926으로 파이를 설정하면 실패한다.(원래는 7번째자리에서 반올림 한 후, 6번째 자리에서 반올림되도록 round(~,6)할 계획이었다. 하지만 잘 되지 않자, 소숫점 아래로 계속 내려가보았고, 3.141592653589 에서 멈춘다. 

R = int(input())**2
print(R*3.141592653589)
print(R*2)

 

 

21입력시 출력되는 결과(초록색 밑줄)

 

 

결국 코드 길이를 극한으로 54B까지 줄였고 1등 찍었다. 

54B

댓글