[Python] BOJ 17441 - 파리채 만들기

JongPark·2022년 6월 13일
4

Baekjoon

목록 보기
8/11
post-thumbnail

snowflake 님의 풀이를 보고 영감을 받아 작성한 글입니다.

문제에서 제시한 내용은 어떤 다각형이 주어질 때, 다각형 내의 임의의 두 점 사이 거리 제곱의 기댓값을 구하라는 것입니다.

다각형 내의 점은 연속적으로 분포하므로 적분을 사용해주어야 합니다.

다각형의 넓이를 SS라고 하고, 임의의 두 점의 좌표를 각각 (x1,y1),(x_1,y_1), (x2,y2)(x_2,y_2) 라 정의해줍니다.

이 때, 두 점 사이 거리의 제곱은 (x1x2)2+(y1y2)2(x_1-x_2)^2+(y_1-y_2)^2이고, 두 점 주변의 미소면적

dA1=ax1ay1dA_1=ax_1ay_1
dA2=ax2ay2dA_2=ax_2ay_2

를 잡았을 때,

전체 다각형 영역 중에서 각 미소면적 내의 점을 독립적으로 하나씩 택할 확률은

dA1dA2S2\frac{dA_1dA_2}{S^2}

라는 사실을 쉽게 알아낼 수 있습니다.

이 후, 기댓값 EE

E=1S2SS(x1x2)2+(y1y2)2dA1dA2=1S2SS(x12+x222x1x2+y12+y222y1y2)dA1dA2\begin{aligned}E&=\frac{1}{S^2}\iint_S\iint_S(x_1-x_2)^2+(y_1-y_2)^2\,dA_1\,dA_2\\&=\frac{1}{S^2}\iint_S\iint_S \left(x_1^2+x_2^2-2x_1x_2+y_1^2+y_2^2 -2y_1y_2\right)dA_1\,dA_2\end{aligned}

라는 적분식으로 계산될 수 있습니다. 여기서 조금 더 하면

  • SSx12dA1dA2=(Sx2dA) ⁣ ⁣(SdA)=S ⁣(Sx2dA)=SSx22dA1dA2,\displaystyle\iint_S \iint_S x_1^2\,dA_1\,dA_2 = \left(\iint_S x^2\,dA \right)\!\!\left(\iint_S \,dA \right) = S\!\left(\iint_S x^2\,dA \right) = \iint_S \iint_S x_2^2\,dA_1\,dA_2,
  • SSx1x2dA1dA2=(Sx1dA1) ⁣ ⁣(Sx2dA2)=(SxdA)2\displaystyle\iint_S \iint_S x_1 x_2\,dA_1\,dA_2 = \left(\iint_S x_1\,dA_1 \right)\!\!\left(\iint_S x_2\,dA_2 \right) = \left(\iint_S x\,dA \right)^2
  • y12,y22y_1^2,y_2^2 항을 적분하면 각각 S ⁣(Sy2dA)\displaystyle S\!\left(\iint_S y^2\,dA \right)라는 식이 되고, y1y2y_1y_2 항을 적분하면 (SydA)2\displaystyle\left(\iint_S y\,dA \right)^2라는 식이 됩니다.

이 때,

A=Sx2+y2dAA = \iint_S x^2 + y^2\,dA
B=SxdAB = \iint_S x\,dA
C=SydAC = \iint_S y\,dA

라고 정의하면 E에 대해

E=1S2 ⁣(2AS2B22C2)E = \dfrac{1}{S^2}\!\left(2AS - 2B^2 - 2C^2 \right)

라고 정리할 수 있습니다.

이 때, 이중적분을 그대로 계산하는 것은 힘듭니다. 그러므로 우리는 이 이중적분을 선적분으로 바꾸어줄 필요가 있습니다. 이를 그린 정리를 활용하여 진행할 것입니다.

AA는 그린 정리에 의하여

A=S13y3dx+13x3dy=13i=1N(xi,yi)(xi+1,yi+1)x3dyy3dxA = \displaystyle\oint_{\partial S} - \dfrac{1}{3}y^3\,dx + \dfrac{1}{3}x^3 \,dy = \dfrac{1}{3}\sum_{i=1}^N \int_{(x_i,\, y_i)}^{(x_{i+1},\, y_{i+1})} x^3\,dy - y^3\,dx

가 됩니다. 이 때 (xi,yi)(x_i,y_i)는 다각형의 ii번째 꼭짓점이고, 첫번째 점은 N+1N+1번째 점입니다. ii번째 변은 y=yi+1yixi+1xi(xxi)+yiy = \dfrac{y_{i+1} - y_i}{x_{i+1} - x_i} (x - x_i) + y_i 로 표현 가능하므로

dx=xi+1xiyi+1yidydx = \dfrac{x_{i+1} - x_i}{y_{i+1} - y_i} dy
dy=yi+1yixi+1xidxdy = \dfrac{y_{i+1} - y_i}{x_{i+1} - x_i} dx

가 됩니다. 이를 첫 번째와 두 번째 항에 대입하고 정적분을 계산하면

A=112i=1N{(yi+1yi)(xi3+xi2xi+1+xixi+12+xi+13)(xi+1xi)(yi3+yi2yi+1+yiyi+12+yi+13)}A = \dfrac{1}{12}\sum_{i=1}^N \left\{(y_{i+1} - y_i)(x_i^3 + x_i^2 x_{i+1} + x_i x_{i+1}^2 + x_{i+1}^3 ) - (x_{i+1} - x_i)(y_i^3 + y_i^2 y_{i+1} + y_i y_{i+1}^2 + y_{i+1}^3 ) \right\}

가 됩니다. 여기서 식을 더 정리해봅시다.

xi+12xiyi+1+xi+1xi2yi+1+xi3yi+1xi+13yixi+12xiyixi+1xi2yi=(xiyi+1xi+1yi)(xi2+xixi+1+xi+12)x_{i+1}^2 x_i y_{i+1} + x_{i+1} x_i^2 y_{i+1} + x_i^3 y_{i+1} - x_{i+1}^3 y_i - x_{i+1}^2 x_i y_i - x_{i+1} x_i^2 y_i \\ = (x_i y_{i+1} - x_{i+1} y_i)(x_i^2 + x_i x_{i+1} + x_{i+1}^2)
 A=112i=1N(xiyi+1xi+1yi)(xi2+xixi+1+xi+12+yi2+yiyi+1+yi+12)\therefore\ A = \displaystyle\dfrac{1}{12}\sum_{i=1}^N (x_i y_{i+1} - x_{i+1} y_i)(x_i^2 + x_i x_{i+1} + x_{i+1}^2 + y_i^2 + y_i y_{i+1} + y_{i+1}^2)

위와 같은 과정을 B,CB,C 에서도 진행할 수 있고, 이를 위의 식에 삽입하면 문제의 답인 기댓값을 얻을 수 있습니다.

a = n_x = n_y = i_x = i_y = 0
n = int(input())
x = [0 for _ in range(n)]
y = [0 for _ in range(n)]
for i in range(n):
    x[i], y[i] = map(int, input().split())
for i in range(1, n - 1):
    a += ((x[i] - x[0]) * (y[i + 1] - y[0]) - (x[i + 1] - x[0]) * (y[i] - y[0])) / 2
for i in range(n):
    n_x += ((x[(i + 1) % n] ** 3 + x[(i + 1) % n] ** 2 * x[i] + x[(i + 1) % n] * x[i] ** 2 + x[i] ** 3) * (y[(i + 1) % n] - y[i])) / 12
    n_y += ((y[(i + 1) % n] ** 3 + y[(i + 1) % n] ** 2 * y[i] + y[(i + 1) % n] * y[i] ** 2 + y[i] ** 3) * (x[(i + 1) % n] - x[i])) / -12
    i_x += ((x[(i + 1) % n] ** 2 + x[(i + 1) % n] * x[i] + x[i] ** 2) * (y[(i + 1) % n] - y[i])) / 6
    i_y += ((y[(i + 1) % n] ** 2 + y[(i + 1) % n] * y[i] + y[i] ** 2) * (x[(i + 1) % n] - x[i])) / -6
print((a * n_x + a * n_y - i_x ** 2 - i_y ** 2) * 2 / a ** 2)

0개의 댓글