알고리즘 코너 첫 글은 간단한 문제를 풀고 그 풀이과정을 일반화 하여 C#을 이용해서 함수로 도출해 보도록 하겠습니다
---------------------------------------------------------------------------------------------------------------------------------------
문제]
승엽이의 국어 점수는 80점, 수학 점수는 70점이다.
승엽이의 국어, 수학, 영어, 과학 점수의 평균이 73점이라면 영어와 과학 점수의 평균은 얼마인가? (2.5점)
- 출처: 한국정보올림피아드 기출 -
문제를 보면, 전체 과목 중 일부 과목의 점수가 제시되고 전체 평균이 주어진 상태에서
나머지 점수를 알 수 없는 과목들의 평균을 구하는 문제이다
일부 과목의 점수가 주어졌기 때문에 그 과목들에 대한 평균을 구할 수 있다
결과적으로 전체평균과 부분평균이 주어진 상태에서 나머지 과목들의 평균을 구하는 문제라 할 수 있겠다
전체 평균과 부분 평균 사이에는 다음과 같은 명제가 성립한다
"평균의 평균은 평균이다" (음.. 말장난 같군 --;)
즉 평균 값이 여러개 있을 경우 그 평균값에 대한 평균은 전체 평균이 되는 것이다. 명제를 좀더 상세화 하면,
"전체 평균은 부분 평균들의 평균이다" 라고 할 수 있겠다
다음 그림을 보자

부분집합 A1과 A2는 전체집합 A에 포함되어 있다
전체집합 A의 평균을 구해 보면 (10+15+20+5+12+22) / 6 = 84 / 6 = 14 이다
그리고 부분집합들의 평균을 구해 보면 다음과 같다
부분집합 A1의 평균: (10+15+20) / 3 = 15
부분집합 A2의 평균: (5+12+22) / 3 = 13
위 명제대로 라면 전체 평균 14는 부분평균들의 평균 값과 같아야 한다
부분 평균들의 평균은 (15 + 13) / 2 = 14 로 전체 평균과 동일함을 알 수 있다
즉 앞의 명제인, '전체 평균은 부분평균들의 평균이다' 가 성립한다
이제 이것을 C#을 이용하여 일반화 해서 함수로 만들어 보도록 하자
전체 평균과 부분평균이 주어진 상태에서 나머지 부분 평균 x를 구하는 식은 다음과 같다
(이 때 점수는 소수점이 없는 양의정수라고 가정한다)
(부분평균 + x )/ 2 = 전체평균
x = 전체평균 * 2 - 부분평균
<함수 정의>
함수설명: 주어진 전체 평균에 대한 부분 평균 구하기
입력 매개변수: 전체 평균, 일부 과목들의 점수 집합(배열이용)
출력 매개변수: 나머지 과목들의 평균 값
static double AvgOfPart(int totalAvg, int[] subjectScore)
{
//1. 주어진 부분점수들의 평균값 구하기
int subjectCount = subjectScore.Length;
int temp = 0;
for (int i = 0; i < subjectCount ; i++)
{
temp += subjectScore[i];
}
double partAvg = (double)temp / subjectCount;
//2. 계산된 부분평균과 전체평균을 계산하여 나머지부분평균을 구한다
double x = totalAvg * 2 - partAvg;
return x;
}
<함수 호출>
static void Main(string[] args)
{
/*
* 국어: 80, 수학: 70, 영어:x, 과학:y
* 전체 평균: 73 일때, 영어,과학의 평균은?
*/
int totalAvg = 73; //전체평균
int[] subjectScore = new int[] { 80, 70 }; //부분점수
double result = AvgOfPart(totalAvg, subjectScore);
Console.WriteLine(result.ToString());
}