문제 URL:
4344번: 평균은 넘겠지
대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.
www.acmicpc.net
다음 문제는 각 테스트 케이스마다 평균을 넘는 학생 수가 몇 퍼센트인지 계산하는 문제이다.
첫째 줄에 테스트 케이스의 개수 C가 주어진 뒤,
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 처음으로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
이 문제를 처음 풀 땐, 첫 번째로 입력받을 학생수 n까지 배열로 생각하여 풀려고 했으나,
그렇게 하면 동적 배열의 크기가 중간에 바뀌게 되어 heap에 문제가 생기는 듯 하였다.
문제를 틀리고 나서 visual studio에 몇 번 돌려봤는데, 오류는 나지 않았지만 시스템에서 계속 예외가 생겨 프로그램이 제대로 작동하지 않는다고 할 뿐더러 heap의 기능이 저하된다고 알려주었다.
따라서 다시 프로그래밍할 때는 변수 n을 사용하여 학생수를 먼저 입력받은 후, 동적 배열을 만들어 점수를 입력받았다.
이렇게 입력받은 점수들을 n으로 나누어 평균을 구하고, 조건문을 이용하여 배열의 요소가 평균보다 크면 count 변수를 증가시키는 방법으로 문제를 풀었다.
여기서 주의해야 할 점은 평균과 퍼센트로 나오는 결괏값은 실수 형태로 나와야 한다는 점이다.
따라서 각각의 코드를 작성할 때 1.0을 같이 곱해주어 각 결과가 실수형으로 나타나게 해주었다.
또한, 문제의 조건 중 소수점 셋째 자리까지 출력하라는 조건이 있으므로 콘솔 출력 형식을 사용하여 소수점을 고정해주었다.
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int c, n, total=0, count=0;
cin >> c;
for(int i=0; i<c; i++)
{
cin >> n;
int* list = new int[n];
for(int j=0; j<n; j++)
{
cin >> list[j];
total += list[j];
}
double avg = 1.0*total/n;
for(int j=0; j<n; j++)
if(list[j]>avg)
count++;
cout << fixed << setprecision(3)
<< 1.0*count/n*100.0 << "%\n";
total=0;
count=0;
}
}