C언어/BAEKJOON

[백준] 4344. 평균은 넘겠지

너굴맨이해치움 2022. 8. 11. 22:02

: solved.ac - bronze 1

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

 

4344번: 평균은 넘겠지

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

www.acmicpc.net

 

 

예제 입력

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%

 

정답

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int c, n;
	double over, total, rate;
	int std[1000] = { 0 };
	scanf("%d", &c); 

	for (int i = 0; i < c; i++) {
		scanf("%d", &n);

		over = 0;
		total = 0;
		rate = 0;
		for (int i = 0; i < n; i++) {
			scanf("%d", &std[i]); 
			total += std[i]; 
		}
		total /= n; 

		for (int i = 0; i < n; i++) {
			if (std[i] > total) over++;
		}
		rate = over / n;
		printf("%.3lf%%", rate * 100);
	}
	return 0;
}


해설

  1. for문을 돌려 총합을 구한다.
  2. 총합을 학생 수로 나누어 평균을 구한다.
  3. for문을 한 번 더 돌려 평균을 넘는 학생의 수를 센다. (이상이 아니라 초과임에 유의한다.)
  4. (평균을 넘는 학생의 수/전체 학생 수)에 100을 곱하여 % 기호를 붙여서 출력한다.

 

1. 위처럼 간단한 풀이법으로 풀 수 있으나, 이 문제에서 유념할 부분이 두 가지 있다.

하나는 자료형이다. 계산 중 정수형과 실수형이 혼재되면 소숫점 아래가 잘린 값이 저장되는 등의 자료 유실이 발생할 수 있다. 저장되는 자료의 형태에 따라 자료형을 올바르게 쓰는 것은 물론, 결과값이 실수로 나와야 할 경우 계산하는 수 또한 실수형이어야 함에 유념한다. (특히 나눗셈)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main() {
	int c, n;
	double over, total, rate;
	int std[1000] = { 0 };
	scanf("%d", &c); //테스트케이스 개수 입력

	for (int i = 0; i < c; i++) {
		scanf("%d", &n); //학생 수 입력

 

2. 두 번째로는 출력 양식이다. %.3을 쓰면 소숫점 셋째 자리 수까지 출력할 수 있음은 기본이고,

% 기호가 출력값에 보이도록 출력하려면 %%와 같이 두 번 겹쳐 써야 한다는 점도 복기해 둔다.

		over = 0;
		total = 0;
		rate = 0;
		for (int i = 0; i < n; i++) {
			scanf("%d", &std[i]); //성적 입력
			total += std[i]; //총합 계산
		}
		total /= n; //평균 계산

		for (int i = 0; i < n; i++) {
			if (std[i] > total) over++;
			//평균을 넘는 학생 수 도출
		}
		rate = over / n; //평균을 넘는 학생들의 비율
		printf("%.3lf%%", rate * 100);
	}
	return 0;
}