Creative Commons License

Software Dev

프로그래밍기본
객체지향
프로젝트관리
알고리즘
데이타베이스

소프트웨어 개발에 필수적이고 필요한 주제에 대한 강의 및 공유

.

알고리즘

주어진 문제를 효과적으로 해결하기 위한 문제해결논리에 대해 다룹니다

[문제] 부분 평균 구하기

작성자 : 박종명
최초 작성일 : 2010-03-19 (금요일)
최종 수정일 : 2010-03-19 (금요일)
조회 수 : 5112

알고리즘 코너 첫 글은 간단한 문제를 풀고 그 풀이과정을 일반화 하여 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());           
}

 

∵Commented by 콩사랑 at 2010-10-20 오후 3:12:25  
부분평균의 평균이 전체 평균이 되려면 부분의 갯수들이 모두 동일해야 하지 않나요?

반례를 들자면
전체집합 A = { 1,2,3,4,5}
부분집합 A1 = {1,2,3} A2=(4,5)
일 때 전체집합 A의 평균은 (1+2+3+4+5)/5 = 15/5 =3 이지만
부분집합 A1의 평균 = (1+2+3)/3 = 2
부분집합 A2의 평균 = (4+5)/2 = 4.5
부분집합 A1과 A2의 평균 \ (2+4.5) =3.25

∵Commented by 박종명 at 2010-10-20 오후 4:33:43  
네. 그렇네요. 감사합니다~
이름
비밀번호
홈페이지
WS <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요