코딩/백준 알고리즘

백준 4344- 평균은 넘겠지(C언어)

lee1201zxc 2022. 5. 25. 12:26
300x250

문제 링크 : https://www.acmicpc.net/problem/4344

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

 

문제 

 

 

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

 

 

 

 

 

첫째 줄에는 테스트 케이스의 개수 C가 주어진다.

둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

 

 

 

출력

 

 

각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.

 

 

예제 입력

 

5
5 50 50 70 80 100
7 100 95 90 80 70 60 50
3 70 90 80
3 70 90 81
9 100 99 98 97 96 95 94 93 91

 

예제 출력

 

40.000%
57.143%
33.333%
66.667%
55.556%

 

해설

 

 

평균 구하기, 실수 자료형 활용, 입출력까지 필요한 좋은 문제이다.

일단 각각의 케이스마다 모든 학생의 점수를 더하고 학생수로 나누어 평균을 구한다.

그리고 이 평균을 각각의 학생 점수와 비교해 평균을 넘는 학생들의 점수를 

출력해주면 된다. 간단해 보이지만 주의항 사항이 있다.

이는 아래 코드를 보며 설명 하겠다.

 

 

코드

#include<stdio.h>
int main(void)
{
	int t;
	scanf("%d",&t);
	for(int x=0;x<t;x++)
	{
		int h=0,g=0;
		double a=0;
		scanf("%d", &h);
		int s[h];
		for(int y=0;y<h;y++)
		{
			scanf("%d",&s[y]);
			a+=s[y];
		}
		a/=h;
		for(int z=0;z<h;z++)
		{
			if(a<s[z])
				g++;
		}
		printf("%.3f%%\n", (double)g/h*100);
	}
	return 0;
}

t는 테스트 케이스의 개수, h는 학생의 수, g는 평균을 넘는 학생수, a는 평균이다.

12행에서 학생의 수만큼 점수를 입력받고 a에 모든 학생의 점수를 더하였다.

17행 for문에서 더한 점수를 학생의 수(h)로 나누어 평균을 구하였다. 

참고로 a는 double형, h는 int형인데 a나누기 h를 하면 자동으로 형 변환되어 계산된다. (메모리가 더 큰 double형으로 됨)

그리고 18행 for문에서 배열 s에 입력받았던 학생의 점수들을 평균 a와 비교하며 학생의 점수가 더 크다면 g값을 1씩 늘린다.(이렇게 평균 넘는 학생수를 구함) 최종적으로 평균을 넘는 학생들의 비율을 구하기 위해 g(평균 넘는 학생수)/h(전체 학생수)*100을 하였고 %0.3f 이렇게 하여야 반올림하여 소수점 셋째 짜리까지 출력할 수 있다. 그리고 '%'를 출력하기 위해 '%%'라고 써주어야 한다. 마지막으로 소수를 출력해야 하는데 g와 h는 모두 int 형으로 정수이므로 앞에(double)를 써주어 강제 형 변환시킨다.

 

 

728x90