1. 문제
28139번: 평균 구하기
2차원 좌표평면 위에 N명의 사람이 있다. 위치가 (x1,y1)인 사람과 위치가 (x2,y2)인 사람 간의 거리는 √(x1−x2)2+(y1−y2)2이다. 위대한 마법사 레이는 이 중 한
www.acmicpc.net
2. 풀이
최악의 경우 5000!가지를 모두 거리를 계산해봐서 평균을 구해야하는데, 당연히 2.5초안에 가능할리는 없고
5000!가지를 안구해봐도 구하는 방법이 있겠지
확률변수 X를 N!가지 각각 경우의 수에서 나올 수 있는 이동거리라고 정의하자.
문제에도 나와있듯이
"총이동거리는 해당 순서에서 첫 번째 사람과 두 번째 사람 간의 거리, 두 번째 사람과 세 번째 사람 간의 거리, ... , N-1번째 사람과 N번째 사람간의 거리의 합이다"
라고 나와있는데, X를 위와 같이 분할해보는 것이다
첫 번째 사람과 두 번째 사람간의 거리 X1
두 번째 사람과 세 번째 사람간의 거리 X2
...
N−1번째 사람과 N번째 사람간의 거리 XN−1이라고 정의하자.
X=N−1∑k=1Xi라고 정의할 수 있다.
그러면 문제에서 원하는 값은 X의 평균으로, E(X)이다.
그러므로 기댓값의 성질을 이용하면, E(X)=N−1∑k=1E(Xi)
사람간의 구별이 없기 때문에 i와 j가 서로 다를때,
i번째 사람과 i+1번째 사람간의 거리의 기댓값과 j번째 사람과 j+1번째 사람간의 거리의 기댓값은 동일하다.
즉, E(Xi)=E(Xj)
그러므로 E(X)=(N−1)E(X1)
그래서, 첫번째와 두번째 사람간의 거리로 가능한 모든 경우를 더하고 평균을 구한 다음에 N−1을 곱하면 그것이 정답이다
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)
'알고리즘 > 확률론 알고리즘' 카테고리의 다른 글
주사위를 던져서 얻은 눈의 수의 합이 n이상이 되기 위해 던져야 하는 횟수의 기댓값 (0) | 2025.01.18 |
---|---|
모든 부분집합 원소의 곱의 합을 구하는 공식이 있다고? (0) | 2023.08.20 |