가중 평균이란?
자연수로 이루어진 배열 하나와, 각 자연수에 대응하는 가중치를 담고 있는 또 다른 배열이 주어졌을 때, 자연수들의 가중 평균(weighted mean)을 계산하는 것이 이번 글의 목표입니다. 가중 평균은 단순 평균과 달리 각 값의 중요도(가중치)를 반영하여 전체 평균을 구하는 방식으로, 통계 및 데이터 분석에서 널리 활용됩니다.
자연수의 가중 평균은 다음 공식을 사용하여 계산할 수 있습니다.
$$\overline{x}=\frac{\displaystyle\sum\limits_{i=1}^n (x_{i*}w_{i})}{\displaystyle\sum\limits_{i=1}^n w_{i}}$$
여기서 x는 자연수, w는 해당 자연수에 연관된 가중치를 의미합니다. 즉, 각 자연수와 가중치를 곱한 값들을 모두 더한 뒤, 가중치의 총합으로 나누면 가중 평균이 됩니다.
입력 예시 1
X[] = {11, 22, 43, 34, 25, 16}
W[] = {12, 12, 43, 54, 75, 16}출력
weighted mean is : 29.3019
설명
(11*12 + 22*12 + 43*43 + 34*54 + 25*75 + 16*16) / (12 + 12 + 43 + 54 + 75 + 16)
입력 예시 2
X[] = {3, 4, 5, 6, 7}
W[] = {4, 5, 6, 7, 8}출력
weighted mean is : 5.33333
설명
(3*4 + 4*5 + 5*6 + 6*7 + 7*8) / (4 + 5 + 6 + 7 + 8)
프로그램의 접근 방식
- 두 개의 서로 다른 배열을 입력받습니다. 하나는 자연수를 저장하는 배열이고, 다른 하나는 각 자연수에 대응하는 가중치를 저장하는 배열입니다.
- 위에서 소개한 공식을 적용하여 자연수의 가중 평균을 계산합니다.
- 계산된 결과를 출력합니다.
알고리즘
시작
Step 1 → 자연수의 가중 평균을 계산하는 함수 선언
float weightedmean(int X[], int W[], int size)
int sum = 0, weight = 0 선언
반복문 For int i = 0 and i < size and i++
weight = weight + X[i] * W[i]
sum = sum + W[i]
반복문 끝
return (float)weight / sum
Step 2 → main() 함수에서
int X[] = {11, 22, 43, 34, 25, 16} 선언
int W[] = {12, 12, 43, 54, 75, 16} 선언
int size_X = sizeof(X)/sizeof(X[0]) 선언
int size_W = sizeof(W)/sizeof(W[0]) 선언
IF (size_X == size_W)
weightedmean(X, W, size_X) 호출
End
Else
-1 출력
End
종료
알고리즘의 핵심은 반복문을 한 번만 순회하면서 가중치를 곱한 값의 누적합(weight)과 가중치의 총합(sum)을 동시에 계산하는 것입니다. 이렇게 하면 시간 복잡도를 O(n)으로 유지할 수 있어 효율적입니다. 또한 두 배열의 크기가 일치하는지 검사하여, 가중치와 값이 올바르게 대응되지 않는 경우 -1을 출력하도록 처리했습니다.
예제 코드
#include<bits/stdc++.h>
using namespace std;
// 가중 평균 계산 함수
float weightedmean(int X[], int W[], int size){
int sum = 0, weight = 0;
for (int i = 0; i < size; i++){
weight = weight + X[i] * W[i];
sum = sum + W[i];
}
return (float)weight / sum;
}
int main(){
int X[] = {11, 22, 43, 34, 25, 16};
int W[] = {12, 12, 43, 54, 75, 16};
int size_X = sizeof(X)/sizeof(X[0]);
int size_W = sizeof(W)/sizeof(W[0]);
if (size_X == size_W)
cout<<"weighted mean is : "<<weightedmean(X, W, size_X);
else
cout << "-1";
return 0;
}
코드에서 주목할 부분은 반환문의 (float) 형 변환입니다. 정수 나눗셈을 수행하면 소수점 이하가 잘려나가기 때문에, 정확한 가중 평균 값을 얻으려면 반드시 실수형으로 형 변환한 후 나눗셈을 해야 합니다.
출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
weighted mean is : 29.3019
이처럼 C++에서는 간단한 반복문과 누적합 계산만으로 자연수의 가중 평균을 손쉽게 구할 수 있습니다. 실제 프로젝트에서는 배열 대신 std::vector를 사용하거나, 가중치의 합이 0인 경우에 대한 예외 처리를 추가하면 더욱 견고한 코드를 작성할 수 있습니다.