알고리즘/백준

<백준> 4344번 평균은 넘겠지 C++ 문제풀이

Han_5ung 2021. 1. 26. 15:08

1. 각 케이스의 평균을 구한 후

2. 평균을 넘는 수의 학생 수를 비율로 나타내는 문제

 

풀이

#include <iostream>
using namespace std;

int main() {
	int test, stu, sco[1000],avg=0; //테스트 케이스, 학생 수, 점수, 평균
	double ans;  //답
	cin >> test;  
	for (int i = 0; i < test; i++) { //테스트 수 만큼 학생 수 입력
		cin >> stu;                  
		int sum = 0;                 //합계 초기화
		for (int j = 0; j < stu; j++) { // 학생 수 만큼
			cin >> sco[j];              // 점수 입력
			sum += sco[j]; 	            // 입력 받은 점수 sum에 더함
		}
		avg = sum / stu; //평균
		double count = 0;
		for (int j = 0; j < stu; j++) { 
			if (avg < sco[j])           // 점수가 평균보다 높을 시 count++
				count++;
		}
		ans = (count / stu) * 100;   //비율 계산
		cout.precision(3);
		cout << fixed; //소숫점 3자리까지만 출력
		cout << ans<<"%"<<endl;
	}
}

주의해야하는 부분이 몇 가지 있는 문제

1.  변수 초기화

2.  소숫점

을 주의하면서 풀어야하는 문제가 아닌가 싶다.

다중 for문을 사용하여 점수를 입력 받아 그 점수를 sum값에 계속 추가하여 평균을 구하였고

다음 for문에서는 점수와 평균을 비교하여 count를 1씩 추가하는 방식을 사용하였다.

이중 sum과 count의 초기화 시점이 주의해야한다고 생각하는데 

cin >> test;  
	for (int i = 0; i < test; i++) {
		cin >> stu;
		int sum = 0;
		for (int j = 0; j < stu; j++) {
			cin >> sco[j]; 
			sum += sco[j]; 	
		}

안쪽 for문을 실행하고 나면 sum에는 이미 값이 들어가 있기 때문에

초기화를 진행하지 않을 시 처음에 입력되어 있던 값에 또 값을 추가하게 된다.

이 부분을 해결하기 위해 for에 진입하기 전에 sum을 0값으로 초기화 해주는 방법을 사용하지만

반대로 for문을 빠져나간 뒤 초기화해도 괜찮다. count의 경우도 마찬가지.

 

마지막으로 주의할 점인 소숫점은 부분은

cout.precision(n);
cout << fixed; 

을 사용하여 쉽게 해결이 가능하다

cout.precision(n); -> 자리를 조정하는 함수이며 ()안의 n의 값을 변경하여 원하는 값의 자리를 지정할 수 있고

cout << fixed;     -> 소숫점 아래의 자리를 지정하는 값이다

cout.precision(3); 
cout << fixed; 

을 사용하였다면 소숫점 아래 3자리를 출력한다는 명령으로 나타낼 수 있다.