본문 바로가기

알고리즘/백준 문제 풀이

[Python] 9246번 다트판

728x90

 

 

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


 

24/11/23

 

 

정규 분포의 기댓값을 구하는 문제다.


 

문제 접근 방식:

 

 

확률 밀도 함수(Probability density function)이 다음과 같이 정규분포 모양으로 주어진다.

 

$$f(r) = \frac{1}{2\pi\sigma^{2}} e^{-\frac{r^{2}}{2\sigma^{2}}}$$

 

이때, $r$은 다트판의 중심으로부터 떨어진 거리를 의미하며, 표준편차 $\sigma$의 값은 문제에서 주어진다.

 

다트판의 중심으로부터 떨어진 거리 $r$만큼의 위치에 다트가 꽃힐 확률은, 저 확률 밀도 함수에 $2\pi r$을 곱한 값이 된다.

 

직관적으로, 다트판의 중심으로부터 떨어진 거리 $r$만큼의 위치의 미소 면적들을 모두 모으면, 고리 모양을 이루고, 그 모양의 면적은 $2 \pi r$이기 때문이다.

 

이러한 확률 분포 함수에 각 영역 별 점수를 곱하여 적분을 하면 그것이 기댓값이 된다. (이산적인 모양의 기댓값의 정의에서는 각 확률에 값을 곱해서 전부 더하면 기댓값이 나왔던 것처럼, 연속적인 모양의 기댓값의 정의는 위와 같다.)

 

즉, 다음과 같이 나온다.

 

$$\mathbb{E}[\text{score}] = \int _{0}^{\infty} (\text{score})\cdot f(r)\cdot 2\pi r \, dr$$

 

전체 점수에 대한 기댓값은 각 영역 별 점수에 대한 기댓값으로 분리할 수 있다.

 

작은 원의 반지름을 $a$, 큰 원의 반지름을 $b$라고 하면 각 영역 별 기댓값은 다음과 같이 표현할 수 있다.

 

$$\begin{align} \mathbb{E}[\text{region}] &= \int_{a}^{b} (\text{region score})\cdot f(r) \cdot 2\pi r \, dr \\ &= (\text{region score}) \cdot \int_{a}^{b} \frac{re^{-\frac{r^{2}}{2\sigma^{2}}}}{\sigma^{2}} \, dr \\ &= (\text{region score}) \cdot [\exp(-\frac{a^{2}}{2\sigma^{2}}) - \exp(-\frac{b^{2}}{2\sigma^{2}})]  \end{align}$$

 

문제에서 각 원들의 반지름을 주고, 표준편차 $\sigma$의 값도 알려주므로, 위의 식을 통해 계산할 수 있다.

 

일반적으로는, 부분적인 부채꼴 모양마다 $1$점부터 $20$점까지 점수가 다 다르므로 이를 고려해서 계산해야 한다.

 

우리는 영역의 모양을 도넛 모양으로 가정하고 기댓값을 계산하므로, $1$점부터 $20$점까지 전부 평균을 낸 $10.5$점이 $\text{region score}$라고 계산하면 된다.

 

두 배 영역, 세 배 영역일 때는 이 점수에 $2$배, $3$배를 한 값이 $\text{region score}$가 될 것이다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 9246번 다트판(Dartboard)
# 확률론, 미적분학
import sys
input = sys.stdin.readline
from math import exp
bullseye, bull, inner_triple, outer_triple, inner_double, outer_double = map(float, input().split())
sigma = float(input())
Var = sigma**2
a = (50*(1 - exp(-bullseye**2/(2*Var)))
     + 25*(exp(-bullseye**2/(2*Var)) - exp(-bull**2/(2*Var)))
     + 10.5*(exp(-bull**2/(2*Var)) - exp(-inner_triple**2/(2*Var)))
     + 31.5*(exp(-inner_triple**2/(2*Var)) - exp(-outer_triple**2/(2*Var)))
     + 10.5*(exp(-outer_triple**2/(2*Var)) - exp(-inner_double**2/(2*Var)))
     + 21*(exp(-inner_double**2/(2*Var)) - exp(-outer_double**2/(2*Var))))
print(a)