※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 28139번 문제인 평균 구하기이다.
문제는 아래 링크를 확인하자.

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

 

28139번: 평균 구하기

$2$차원 좌표평면 위에 $N$명의 사람이 있다. 위치가 ($x_1, y_1$)인 사람과 위치가 ($x_2, y_2$)인 사람 간의 거리는 $\sqrt{\left(x_1 - x_2 \right)^2 + \left(y_1 - y_2 \right)^ 2}$이다. 위대한 마법사 레이는 이 중 한

www.acmicpc.net

모든 방문방법의 경우의 수는 N!가지이고, 각 방문방법은 N-1개의 방향에지로 구성되어 있음을 관찰하자. 또한 모든 방문방법에 포함된 각 방향에지의 개수는 전부 같음을 관찰하자.

 

위의 관찰을 이용하면 (모든 방향에지의 길이의 합)을 (방향에지의 개수)/(N-1)로 나누어 문제에서 찾는 기댓값을 구할 수 있음을 알 수 있다. 여기서 사람 A에서 B로 향하는 것을 나타내는 방향에지와 B에서 A로 향하는 것을 나타내는 방향에지는 서로 다른 에지임에 유의해 계산하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cmath>
using namespace std;
typedef long double ld;

ld ans;

int N;
int coord[5000][2];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;
	for (int i = 0; i < N; i++) cin >> coord[i][0] >> coord[i][1];

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			int dx = (coord[i][0] - coord[j][0]), dy = (coord[i][1] - coord[j][1]);
			ans += sqrt(dx * dx + dy * dy);
		}
	}

	cout << fixed;
	cout.precision(10);

	cout << ans / N;
}
728x90

+ Recent posts