작성일 :

문제 링크

20332번 - Divvying Up

설명

세 명의 팀원이 n개의 대회에서 받은 상금을 공평하게 나누려는 상황에서, n (1 ≤ n ≤ 10,000)과 각 대회의 상금 w (1 ≤ w ≤ 100,000)가 주어질 때, 모든 상금을 세 명이 정확히 같은 금액씩 나눌 수 있는지 판별하는 문제입니다.

공평한 분배가 가능하면 “yes”를, 불가능하면 “no”를 출력합니다.


접근법

세 명이 정확히 같은 금액을 받으려면, 각자 (전체 상금 합 ÷ 3)을 받아야 합니다.

이는 전체 상금의 합이 3으로 나누어떨어질 때만 가능합니다.


각 대회의 상금을 어떻게 분배하는지는 중요하지 않으며, 단지 전체 합이 3의 배수인지만 확인하면 됩니다.

예를 들어, 상금이 [100, 200, 300]이라면 합은 600이고 3으로 나누어떨어지므로 각자 200씩 받을 수 있습니다.

반면 상금이 [100, 200, 400]이라면 합은 700이고 3으로 나누어떨어지지 않으므로 공평한 분배가 불가능합니다.


모든 상금의 합을 계산한 후, 이 합이 3으로 나누어떨어지는지 확인하여 결과를 출력합니다.

상금의 최대 합은 10,000 × 100,000 = 1,000,000,000이므로 64비트 정수형으로 충분히 표현할 수 있습니다.



Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;

namespace Solution {
  class Program {
    static void Main(string[] args) {
      var n = int.Parse(Console.ReadLine()!);
      var prizes = Console.ReadLine()!.Split();
      var sum = 0L;
      
      for (var i = 0; i < n; i++)
        sum += long.Parse(prizes[i]);
      
      Console.WriteLine(sum % 3 == 0 ? "yes" : "no");
    }
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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 sum = 0;
  
  for (int i = 0; i < n; i++) {
    ll w; cin >> w;
    sum += w;
  }
  
  cout << (sum % 3 == 0 ? "yes" : "no") << '\n';
  return 0;
}