본문 바로가기

Algorithm Problems/수학

[백준/C++] 4344번: 평균은 넘겠지

문제

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


문제 요약

각 테스트 케이스마다 학생 수 n명의 점수가 주어진다.

 

점수는 0 이상 100 이하인 정수이다.

 

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


코드

#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;

int t;

int main() {
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> t;

    while (t--) {
        int n;
        cin >> n;

        double avr = 0;
        vector<double> v;

        for (int i = 0; i < n; i++) {
            double num;
            cin >> num;

            avr += num;
            v.push_back(num);
        }

        avr = avr / n;

        double cnt = 0;

        for (int i = 0; i < v.size(); i++) {
            if (v[i] > avr) cnt++;
        }

        double res = (cnt / n) * 100;

        cout << fixed << setprecision(3) << res << "%\n";
    }

    return 0;
}

코드 설명

1. 각 테스트 케이스에서 학생들의 점수 입력을 받을 때마다 벡터 v에 저장한다.

 

2. 벡터에 존재하는 점수의 평균을 구한다.

 

3. 다시 벡터에 존재하는 점수를 차례로 접근하면서, 평균보다 큰 점수 개수를 센다.

 

4, 평균 이상 점수의 개수 / 점수의 총 개수 × 100 으로 결과 값을 double 형식으로 구한다.

 

5. 결과를 소수점 셋째자리까지 반올림하여 출력한다.


고찰

C++에서 소수점 n번째 자리까지 반올림하여 출력해야할 때,

 

iomanip 라이브러리의 setprecision 을 사용하면 된다.

 

ex) 소수점 셋째짜리까지 res를 출력

cout << fixed << setprecision(3) << res;