[백준 2303] 숫자 게임 (C++, C#) - soo:bak
작성일 :
문제 링크
설명
여러 명이 각각 다섯 장의 카드를 받아, 그 중 세 장을 선택하여 합의 일의 자리 수를 최대화하는 문제입니다.
각 사람은 다섯 장 중 임의의 세 장을 선택하고, 그 합의 일의 자리 수를 구해 최댓값을 만든 뒤,
가장 큰 값을 만든 사람이 승리하게 됩니다.
만약, 여러 사람이 같은 값을 만들었다면, 번호가 더 큰 사람이 승자로 간주됩니다.
접근법
모든 사람에 대해 다음 과정을 반복합니다:
- 다섯 장의 카드 중 세 장을 고르는 모든 조합을 시도합니다.
- 각 조합의 합을 구하고, 그 합의 일의 자리 수를 계산합니다.
- 그 중 가장 큰 일의 자리 수를 해당 사람의 점수로 기록합니다.
전체 사람 중 가장 높은 점수를 가진 사람을 추적하며, 점이 발생할 경우 번호가 큰 사람으로 갱신합니다.
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;
}