작성일 :

문제 링크

2303번 - 숫자 게임

설명

여러 명이 각각 다섯 장의 카드를 받아, 그 중 세 장을 선택하여 합의 일의 자리 수를 최대화하는 문제입니다.

각 사람은 다섯 장 중 임의의 세 장을 선택하고, 그 합의 일의 자리 수를 구해 최댓값을 만든 뒤,

가장 큰 값을 만든 사람이 승리하게 됩니다.

만약, 여러 사람이 같은 값을 만들었다면, 번호가 더 큰 사람이 승자로 간주됩니다.


접근법

모든 사람에 대해 다음 과정을 반복합니다:

  • 다섯 장의 카드 중 세 장을 고르는 모든 조합을 시도합니다.
  • 각 조합의 합을 구하고, 그 합의 일의 자리 수를 계산합니다.
  • 그 중 가장 큰 일의 자리 수를 해당 사람의 점수로 기록합니다.


전체 사람 중 가장 높은 점수를 가진 사람을 추적하며, 점이 발생할 경우 번호가 큰 사람으로 갱신합니다.



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
using System;
using System.Linq;

class Program {
  static void Main() {
    int n = int.Parse(Console.ReadLine());
    int maxScore = -1, winner = 0;

    for (int i = 1; i <= n; ++i) {
      var card = Console.ReadLine().Split().Select(int.Parse).ToArray();
      int best = 0;

      for (int a = 0; a < 3; ++a)
        for (int b = a + 1; b < 4; ++b)
          for (int c = b + 1; c < 5; ++c)
            best = Math.Max(best, (card[a] + card[b] + card[c]) % 10);

      if (best >= maxScore) {
        maxScore = best;
        winner = i;
      }
    }

    Console.WriteLine(winner);
  }
}

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
33
34
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;
  int maxScore = -1, winner = 0;

  for (int i = 1; i <= n; ++i) {
    vi card(5);
    for (int &x : card)
      cin >> x;

    int score = 0;
    for (int a = 0; a < 3; ++a) {
      for (int b = a + 1; b < 4; ++b) {
        for (int c = b + 1; c < 5; ++c)
          score = max(score, (card[a] + card[b] + card[c]) % 10);
      }
    }

    if (score >= maxScore) {
      maxScore = score;
      winner = i;
    }
  }

  cout << winner << "\n";

  return 0;
}