하루의 쉼터

[BAEKJOON] 4344. 평균은 넘겠지 본문

Coding Test/BaekJoon

[BAEKJOON] 4344. 평균은 넘겠지

Changun An 2021. 10. 24. 01:20
반응형

Title :
4344. 평균은 넘겠지

Question :

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 

당신은 그들에게 슬픈 진실을 알려줘야 한다.

 

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

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

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

 

Example :
입력 : 
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%

Limited - Time :
1 초

Limited - Space :
256 MB

전체 Flow Chart :

 

Code :

cl_solution.hpp

#include<iostream>
#include<cstring>
class cl_solution{
public :
	void fn_run(int num);
};

cl_solution.cpp

#include "cl_solution.hpp"

void cl_solution::fn_run(int num){
	std::ios_base::sync_with_stdio(false); 
	std::cin.tie(NULL);
	int i = 0, j = 0, user_data_size = 0, sum = 0, result_cnt= 0 ;
	double avg=0;

	while (i < num) {
		std::cin >> user_data_size;
		if(1<=user_data_size&&user_data_size<=1000){
			int* arr_data = new int[user_data_size];
			memset(arr_data, 0, sizeof(int) * user_data_size);
			while (j < user_data_size) {
				std::cin>>arr_data[j];
					if(0<=arr_data[j]&&arr_data[j]<=100){
					sum += arr_data[j];
					j++;
				}
			}
			j = 0;
			avg = (double)sum / (double)user_data_size;
			while (j < user_data_size) {
				if (arr_data[j] > avg) {
					result_cnt++;
				}
				j++;
			}
			std::cout <<std::fixed;
			std::cout.precision(3);
			std::cout << ((double)result_cnt / (double)user_data_size) * 100 <<"%\n";

			result_cnt=j= sum = 0;
			avg = 0;
			delete arr_data;
			i++;
		}
	}
}

main.cpp

#include "cl_solution.hpp"

int main() {
	cl_solution sol;
	int num = 0;
	std::cin >> num;
	if(num>0){
  	  sol.fn_run(num);
    }
	return 0;
	
}

 

코드&문제 분석 :

합산, 평균 도출, 평균 보다 높은 학생 수 체크로 크게 세가지로 볼수 있다.

사용 변수 :

Type 변수 명 설명
int i loop문을 제어하기 위해 사용 - 초기 num 관련
int j loop문을 제어하기 위해 사용 - 학생 수 관련
int user_data_size 학생 몇 명을 할지 사용자에게 크기를 입력 받는 변수
int sum 학생 점수의 합
int result_cnt 평균 보다 넘는 학생 수를 체크하는 변수
double avg 학생 점수의 평균
int* arr_data 학생 점수를 담기 위한 배열

 

1. 조건 

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

2. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 

이어서 N명의 점수가 주어진다.

3. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

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

1.1. 필자는 여기서 0보다 적은 테스트 케이스 C를 주어진다면 종료 하게 하였다.

2. 문제 해결

2.1 합산

사용자에게 학생 인원을 입력 받아 조건을 체크하고 배열의 크기를 정하고, 초기화 시켜 준 후 점수를 합산한다.

	std::cin >> user_data_size;
		if(1<=user_data_size&&user_data_size<=1000){
			int* arr_data = new int[user_data_size];
			memset(arr_data, 0, sizeof(int) * user_data_size);
			while (j < user_data_size) {
				std::cin>>arr_data[j];
					if(0<=arr_data[j]&&arr_data[j]<=100){
					sum += arr_data[j];
					j++;
				}
			}

 

2.2 평균 도출

avg = (double)sum / (double)user_data_size;

 

2.3 평균 보다 높은 학생 수 체크

	while (j < user_data_size) {
				if (arr_data[j] > avg) 
					result_cnt++;
				j++;
	}

 

3. 소수점 셋째 자리까지 출력

std::cout <<std::fixed;
std::cout.precision(3);
std::cout << ((double)result_cnt / (double)user_data_size) * 100 <<"%\n";

 

4. 초기화

	result_cnt=j= sum = 0;
	avg = 0;
	delete arr_data;

 

Result :

 

BackJoon :

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

 

4344번: 평균은 넘겠지

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

www.acmicpc.net

 

GitHub :

https://github.com/Anchangun/BaekJoon/tree/main/Question/Array/4344.%20%ED%8F%89%EA%B7%A0%EC%9D%80%20%EB%84%98%EA%B2%A0%EC%A7%80

 

GitHub - Anchangun/BaekJoon

Contribute to Anchangun/BaekJoon development by creating an account on GitHub.

github.com

 

반응형

'Coding Test > BaekJoon' 카테고리의 다른 글

[BAEKJOON] 2557. Hello World  (0) 2021.11.25
[BAEKJOON] 1065. 한수 - Feat. C++  (0) 2021.10.30
[BAEKJOON] 1100. 더하기 사이클  (0) 2021.10.17
[BAEKJOON] 10871. X보다 작은 수  (0) 2021.10.11
[BAEKJOON] 2884. 알람 시계  (0) 2021.10.11
Comments