Loading [MathJax]/jax/output/CommonHTML/jax.js
 

확률론 - 5000!개의 거리의 합의 평균을 구하는 방법

1. 문제

 

28139번: 평균 구하기 (acmicpc.net)

 

28139번: 평균 구하기

2차원 좌표평면 위에 N명의 사람이 있다. 위치가 (x1,y1)인 사람과 위치가 (x2,y2)인 사람 간의 거리는 (x1x2)2+(y1y2)2이다. 위대한 마법사 레이는 이 중 한

www.acmicpc.net

 

2. 풀이

 

최악의 경우 5000!가지를 모두 거리를 계산해봐서 평균을 구해야하는데, 당연히 2.5초안에 가능할리는 없고

 

5000!가지를 안구해봐도 구하는 방법이 있겠지

 

확률변수 XN!가지 각각 경우의 수에서 나올 수 있는 이동거리라고 정의하자.

 

문제에도 나와있듯이

 

"총이동거리는 해당 순서에서 첫 번째 사람과 두 번째 사람 간의 거리, 두 번째 사람과 세 번째 사람 간의 거리, ... , N-1번째 사람과 N번째 사람간의 거리의 합이다"

 

라고 나와있는데, X를 위와 같이 분할해보는 것이다

 

첫 번째 사람과 두 번째 사람간의 거리 X1

 

두 번째 사람과 세 번째 사람간의 거리 X2

 

...

 

N1번째 사람과 N번째 사람간의 거리 XN1이라고 정의하자.

 

X=N1k=1Xi라고 정의할 수 있다.

 

그러면 문제에서 원하는 값은 X의 평균으로, E(X)이다.

 

그러므로 기댓값의 성질을 이용하면, E(X)=N1k=1E(Xi)

 

사람간의 구별이 없기 때문에 ij가 서로 다를때,

 

i번째 사람과 i+1번째 사람간의 거리의 기댓값과 j번째 사람과 j+1번째 사람간의 거리의 기댓값은 동일하다.

 

즉, E(Xi)=E(Xj)

 

그러므로 E(X)=(N1)E(X1)

 

그래서, 첫번째와 두번째 사람간의 거리로 가능한 모든 경우를 더하고 평균을 구한 다음에 N1을 곱하면 그것이 정답이다

 

from sys import stdin

#두 점 a,b의 거리를 구하는 함수
def distance(a,b):
    
    return ((a[0]-b[0])**2 + (a[1]-b[1])**2)**(1/2)

n = int(stdin.readline())

points = []

for _ in range(n):
    
    x,y = map(int,stdin.readline().split())

    points.append((x,y))


#가능한 두 점 사이의 거리의 총 합을 개수로 나눠 평균을 구한다
total = 0
count = 0

for i in range(n-1):
    
    for j in range(i+1,n):
        
        total += distance(points[i],points[j])
        count += 1

mean = total/count

#기댓값의 선형성을 이용하면 N!가지의 모든 경우에 대한 기댓값을 구하게 된다
print((n-1)*mean)
728x90