[BOJ, 백준] 24726 미적분학 입문하기 2 Python
2024. 10. 4. 14:59ㆍAlgorithm
(문제 사진이 안보인다... 어째서지)
문제 해결에 있어 주안점은 2가지가 되겠다.
1. 삼각형을 어떠한 방식으로 분할할 것인가? -> 정렬에 대한 이해 필요 / 회전체를 어떻게 분할 할 것인가?
2. 부피 공식의 구현
1. x축에 대해서 회전을 시킬 경우, x축의 값에 따른 정렬
y축에 대해서 회전을 시킬 경우에는, y축의 값에 따른 정렬이 필요하겠다.
정렬된 순서대로 부피를 구해주면 되겠다.
즉, (첫번째 - 두번째를 이은 직선으로 회전시켰을때) + (두번째 - 세번째를 이은 직선으로 회전시켰을 때) - (세번째 - 첫번째를 이은 직선으로 회전시켰을 때)
2. 부피 공식의 구현에 있어서는 케이스를 조금 나눌 필요가 있다.
x좌표 혹은 y좌표가 같은지 확인할 필요가 있다. (두점이 주어졌을 때 직선의 방정식을 세워보게 되면, 두 점의 x좌표 혹은 y좌표가 같은 경우에는 직선의 방정식에서의 분모가 0이 되는 경우가 발생할 수 있으므로, ZeroDivisor Error가 나올 수 있겠다.)
이때는 그냥 깡구현으로 하면 되겠다. (사실 정적분이니까..)
해답은 다음과 같겠다.
import sys
import copy
import math
input = sys.stdin.readline
x1,y1,x2,y2,x3,y3 = map(int,input().split())
pts = [[x1,y1],[x2,y2],[x3,y3]]
pts.sort(key = lambda x: x[0])
sort_x_pts = copy.deepcopy(pts)
#x좌표 기준으로 정렬
pts.sort(key = lambda x:x[1])
sort_y_pts = copy.deepcopy(pts)
#y좌표 기준으로 정렬
def partial_vol(pt1,pt2):
x1,y1 = pt1[0], pt1[1]
x2,y2 = pt2[0], pt2[1]
axis_x_vol, axis_y_vol = 0,0
if x1 == x2:
#x축 좌표는 동일한 경우이므로, x축 기준으로 회전했을때는 0
x = x1
axis_y_vol = math.fabs(math.pi * (x ** 2) * (y2 - y1))
elif y1 == y2:
#y축 좌표는 동일한 경우이므로, y축 기준으로 회전했을때는 0
y = y1
axis_x_vol = math.fabs(math.pi * (y ** 2) * (x2 - x1))
else:
a = (y2 - y1) / (x2 - x1)
b = (x2 * y1 - x1 * y2) / (x2 - x1)
c = (x2 - x1) / (y2 - y1)
d = (y2 * x1 - x2 * y1) / (y2 - y1)
axis_x_vol = math.fabs((x2 ** 3 - x1 ** 3) * (a ** 2 / 3) + (x2 ** 2 - x1 ** 2) * (a * b) + (x2 - x1) * b ** 2) * math.pi
axis_y_vol = math.fabs((y2 ** 3 - y1 ** 3) * (c ** 2 / 3) + (y2 ** 2 - y1 ** 2) * (c * d) + (y2 - y1) * d ** 2) * math.pi
return axis_x_vol, axis_y_vol
answer_x = math.fabs(partial_vol(sort_x_pts[0], sort_x_pts[1])[0] + partial_vol(sort_x_pts[1], sort_x_pts[2])[0] - partial_vol(sort_x_pts[2], sort_x_pts[0])[0])
answer_y = math.fabs(partial_vol(sort_y_pts[0], sort_y_pts[1])[1] + partial_vol(sort_y_pts[1], sort_y_pts[2])[1] - partial_vol(sort_y_pts[2], sort_y_pts[0])[1])
print(answer_x, answer_y)
'Algorithm' 카테고리의 다른 글
[BOJ, 백준] 25958 예쁜수 Python (1) | 2024.10.15 |
---|---|
[BOJ, 백준] 1036 36진수 Python (1) | 2024.10.07 |
[BOJ, 백준] 27725 지수를 더하자 Python (1) | 2024.09.06 |
[BOJ, 백준] 1916 최소비용 구하기 python (0) | 2024.09.02 |
[BOJ, 백준] 1713 후보 추천하기 Python (0) | 2024.08.28 |