작성일 :

문제 링크

29965번 - Average scores

설명

각 플레이 기록에서 플레이어와 점수가 주어질 때, 두 사람의 평균 점수를 비교해 더 높은 사람을 출력하는 문제입니다. 평균이 같으면 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;
}