Computer Science/Algorithm Problem

백준] 10984 - 내 학점을 구해줘(2015 KAIST 5th ACM-ICPC Mock)

TwinParadox 2019. 1. 22. 19:49
728x90

시간 제한 : 1초

메모리 제한 : 256MB




입력

첫 번째 줄에 학기의 수 T가 주어진다. 두 번째 줄부터 T개 학기에 대한 정보가 주어진다.

각 학기에 대한 정보는 다음과 같이 구성되어 있다. 첫 번째 줄에 들었던 과목의 수 N이 주어지고, 다음 N개 줄에 걸쳐서 N개 과목들의 학점 C와 성적 G가 주어진다. (1 ≤ N ≤ 10, 1 ≤ C ≤ 6의 정수) G는 {0, 0.7, 1, 1.3, 1,7, 2, 2.3, 2.7, 3, 3.3, 3.7, 4, 4.3} 중 하나이며 소수 부분은 최대 한 자리까지 주어진다.




출력

각 학기에 대해 근우의 총 학점과 평점(GPA)을 출력한다. 평점은 소수점 아래 두 번째 자리에서 반올림한다. 




소스코드

#include <iostream>
using namespace std;
int main(void)
{
	int t, n;
	int sum1, sum2;
	double c, g;
	cin >> t;
	cout.precision(1);
	while (t--)
	{
		sum1 = sum2 = 0.0;
		cin >> n;
		for (int i = 0; i < n; i++)
		{
			cin >> c >> g;
			sum1 += g * 10 * c;
			sum2 += c;
		}

		int tmp = (int)((double)sum1 / sum2 + 0.5) * 10;
		cout << (int)sum2 << " " << fixed << (double)tmp / 100 << "\n";
	}
}




Tip

이 문제가 되게 쉬운 문제 인데, 그냥 무의식으로 풀면 틀린다. 부동소수점의 오차로 인해 반올림이 제대로 작동하지 않는 경우, 원하지 않는 답이 나오기 때문이다. 필자는 그냥 학점을 아예 정수로 바꿔 소수 첫 번째자리를 기준으로 반올림을 시키고, 마지막에 출력할 때 다시 10을 나눠 출력시켰다.



728x90