Algorithm/C

[백준] 4344번 : 평균은 넘겠지 C/C++ 문제풀이 솔루션

Printemp 2021. 11. 28.

문제

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

입력

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

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

출력

 

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

 

 

 

점수의 평균 계산과 평균을 넘는 학생들의 비율 계산은 average 함수에서 진행하였다. 이때 main 함수의 점수 배열, 결과값 변수, 학생 수를 인수로 받아주었다. 결과값 변수 result를 average에서 포인터로 넘겨받아 계산한 값이 바로 변경되도록 했다. 이 문제에서 사소하지만 중요한 것은 출력형식이다. sprintf로 result의 형식을 %.3lf 로 바꾸고, strcat을 이용하여 result 뒤에 %를 붙이는 방식을 사용했다. 이외에도 다양한 방법이 있다. sscanf를 사용해도 되고, 미리 형식을 바꾸는게 아니더라도, printf로 출력할때 바꿔주어도 된다. printf("%0.3lf%%", result);

%뒤에 %를 하나 더 붙이면 %기호를 출력할 수 있다.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>

void average(int arr[], double* r, int y);

int main()
{
	double result = 0;
	int n, i, k, j;
	int ar[1001] = { 0 };
	char s[10] = { 0 };
	scanf("%d", &n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &k);
		for (j = 0; j < k; j++)
			scanf("%d", &ar[j]);
		average(ar, &result, k);
		sprintf(s, "%.3lf", result);
		strcat(s, "%");
		printf("%s\n", s);
	}
    
	return 0;
}
void average(int arr[], double* r, int y)
{
	int sum = 0, i;
	double ave = 0, p = 0;
	int* x = NULL;
	x = arr;
	for (i = 0; i < y; i++)
		sum += x[i];
	ave = (double)sum / y;
	for (i = 0; i < y; i++)
	{
		if (x[i] > ave)
			p++;
	}
	*r = p / y * 100;
}

댓글

💲 추천 글