알고리즘/BOJ

[BOJ] 4344 - 평균은 넘겠지

쭁쭁이 2018. 4. 3. 02:16
문제
학생들의 시험 점수들을 받아 평균을 구하고 평균이 넘는 학생들의 비율을 계산하는 문제.


난이도
난이도 下, 소요시간 10분



풀이 과정

새벽에 잠이 안와서 쉬운 거 하나 풀고 기쁜 마음으로 잠들자는 생각에 적당히 쉬운 걸 찾다가

정답률 40%정도면 적절하다 싶어서 골랐다.


scores라는 vector<int>형 배열을 만들고 차례차례 값을 받아 push해준 뒤,

accumulate 함수로 0.0부터 시작해서 scores의 첫 번째 원소부터 마지막 원소까지 다 더하고 scores의 원소의 개수로 나눠준다. 


예전 같았으면 C++을 쓰면서도 포인터적인(?) 사고를 못벗어나고
동적할당을 해서 값을 입력받고 평균도 직접 함수를 짜서 구했겠지만
이젠 그냥 STL로 해결하니 매우매우매우 편하다.


이제 scores에서 pop해가면서 평균보다 큰놈들의 개수를 세고 비율을 구해서 출력하면 끝~~~~


매우 쉬웠던 덕에 빨리 자게 됐다.


코드는 이렇게 짰다.

#include <iostream>
#include <numeric>
#include <vector>

using namespace std;

int main(void)
{
	int c = 0, n = 0;
	cin >> c;

	for (int t = 0; t < c; t++)
	{
		int count = 0;
		cin >> n;
		vector<int> scores;
		for (int i = 0; i < n; i++)
		{
			int score = 0;
			cin >> score;
			scores.push_back(score);	// 차례차례 입력받아 배열에 넣어줌
		}
		double avg = accumulate(scores.begin(), scores.end(), 0.0) / scores.size();		// vector의 원소들을 더해주는 std::accumulate 함수

		while (!scores.empty())
		{
			int back = scores.back();
			scores.pop_back();

			if (back > avg)
				count++;	// 정수를 한개씩 뽑으면서 평균보다 크다면 count 증가
		}
		printf("%.3lf%%\n", (double)count / n * 100.0);		// %로 바꿔서 출력
	}

	return 0;
}