대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
#include <iostream>
using namespace std;
int main() {
// 테스트 케이스의 개수 C를 입력 받는다
int testCase;
cin >> testCase;
// 소수점 자리수 설정(기본 반올림)
cout << fixed; // 소수점 자리수 설정
streamsize prec = cout.precision(); // 현재 기본 자리수 저장
cout.precision(3); // 자리수 고정(fiexd로 인해 소수점 고정)
int n; // 케이스별 학생 수
int count = 0; // 평균을 넘는 학생들의 수
int students[1000] = { 0 }; // 학생들의 점수를 담는 배열
double average;
for (int i = 0; i < testCase; i++)
{
average = 0;
// 각 테스트 케이스마다 학생의 수가 첫 수로 주어지고,
// 이어서 n명의 점수가 주어진다.
cin >> n;
for (int k = 0; k < n; k++)
{
cin >> students[k];
average += students[k];
}
// 평균값을 구한다.
average /= n;
count = 0;
for (int k = 0; k < n; k++)
{
// 평균을 넘는 학생의 수를 증가시킨다.
if (average < students[k])
count++;
}
// 평균을 넘는 학생들의 비율 값을 구하여 출력한다.
cout << (double)count / n * 100 << "%" << endl;
}
cout.unsetf(ios::fixed); // 소수점 고정 해제
cout.precision(prec); // 자리수 고정 해제
return 0;
}
cout << fixed;
는 소수점을 고정시켜 출력하겠다는 뜻이다.
cout.precision(num);
는 num자리의 숫자까지 표현하겠다는 뜻이다.
이 두가지를 같이 사용해야 소수점 자리수를 원하는대로 변경이 가능하다.
예를들어 cout << fixed; cout.precision(3);
의 경우는 소수점 3자리까지 표현하는 명령이다.
소수점 고정을 해제하려면 cout.unsetf(ios::fixed);
명령어를 작성하면 된다.
그리고 기본적으로 나머지 버려지는 자리수는 반올림된다.
cout.unsetf(ios::fixed);
명령어를 통해 소수점을 해제해도 처음 설정한 자리수는 남아있다. 그래서 위에서 사용한 cout.precision(num);
을 초기화하려면
std::streamsize prec = cout.precision();
와 같이 변수에 저장해두고 다시 cout.precision(prec);
로 설정해주면 된다.
참고 자료 및 사이트 (감사합니다)