[BOJ, 백준] 24726 미적분학 입문하기 2 Python

2024. 10. 4. 14:59Algorithm

 

(문제 사진이 안보인다... 어째서지)

 

 

문제 해결에 있어 주안점은 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)