[백준 29965] Average scores (C#, C++) - soo:bak
작성일 :
문제 링크
설명
각 플레이 기록에서 플레이어와 점수가 주어질 때, 두 사람의 평균 점수를 비교해 더 높은 사람을 출력하는 문제입니다. 평균이 같으면 V를, 기록이 없는 사람의 평균은 0으로 간주합니다.
접근법
각 플레이어의 점수 합계와 플레이 횟수를 따로 누적합니다. 평균을 비교할 때 나눗셈을 사용하면 부동소수점 오차가 발생할 수 있으므로, 교차 곱셈으로 비교합니다. 즉, 합계1 × 횟수2와 합계2 × 횟수1을 비교하면 정수 연산만으로 정확한 판단이 가능합니다.
플레이 기록이 없는 경우 평균이 0이므로, 횟수가 0일 때는 1로 대체하여 계산합니다.
Code
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
class Program {
static void Main() {
var n = int.Parse(Console.ReadLine()!);
var sumM = 0L;
var sumJ = 0L;
var cntM = 0;
var cntJ = 0;
for (var i = 0; i < n; i++) {
var parts = Console.ReadLine()!.Split();
var who = parts[0][0];
var p = int.Parse(parts[1]);
if (who == 'M') { sumM += p; cntM++; }
else { sumJ += p; cntJ++; }
}
var lhs = sumM * Math.Max(1, cntJ);
var rhs = sumJ * Math.Max(1, cntM);
var ans = 'V';
if (cntM == 0 && cntJ == 0) ans = 'V';
else if (lhs > rhs) ans = 'M';
else if (lhs < rhs) ans = 'J';
Console.WriteLine(ans);
}
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; cin >> n;
ll sumM = 0, sumJ = 0;
int cntM = 0, cntJ = 0;
for (int i = 0; i < n; i++) {
char who; int p; cin >> who >> p;
if (who == 'M') { sumM += p; cntM++; }
else { sumJ += p; cntJ++; }
}
ll lhs = sumM * max(1, cntJ);
ll rhs = sumJ * max(1, cntM);
char ans = 'V';
if (cntM == 0 && cntJ == 0) ans = 'V';
else if (lhs > rhs) ans = 'M';
else if (lhs < rhs) ans = 'J';
cout << ans << "\n";
return 0;
}