~cpp
#include <iostream>
using namespace std;
#define nTeam 101 // 팀 수
#define nProblem 9 // 문제 번호
// Team 구조체
struct Team
{
int solvedProblem; // 푼 문제의 수
int timePenalty; // 시간 패널티
bool incorrectSubmit[nProblem];
bool correctSubmit[nProblem];
};
void init(Team *team);
void InputInformation(Team *team, bool *joined);
void RankTeam(Team *team, bool *joined);
int main()
{
Team team[nTeam] = {{0, }, {0, }, {false, }, {false, }};
bool joined[nTeam] = {false, };
int nCase;
int count = 0;
cin >> nCase;
cin.get();
cin.get();
while (count < nCase)
{
init(team);
InputInformation(team, joined);
RankTeam(team, joined);
if (count < nCase-1)
cout << endl;
count++;
}
return 0;
}
void init(Team *team)
{
int i, j;
for (i=1 ; i<nTeam ; i++)
{
for (j=1 ; j<=nProblem ; j++)
{
team[i].correctSubmit[j] = false;
team[i].incorrectSubmit[j] = false;
}
team[i].solvedProblem = 0;
team[i].timePenalty = 0;
}
}
void InputInformation(Team *team, bool *joined)
{
int teamNumber, problemNumber, timePenalty;
char state;
while (cin.peek() != EOF)
{
if (cin.peek() == '\n')
{
cin.get();
break;
}
cin >> teamNumber >> problemNumber >> timePenalty >> state;
cin.get();
joined[teamNumber] = true;
switch (state)
{
case 'I':
team[teamNumber].incorrectSubmit[problemNumber] = true;
break;
case 'C':
if (team[teamNumber].correctSubmit[problemNumber] == false)
{
team[teamNumber].solvedProblem++;
team[teamNumber].timePenalty += timePenalty;
if (team[teamNumber].incorrectSubmit[problemNumber] == true)
team[teamNumber].timePenalty += 20;
team[teamNumber].correctSubmit[problemNumber] = true;
}
break;
}
}
}
void RankTeam(Team *team, bool *joined)
{
int i;
int bestTeam;
int isBreak;
while (1)
{
for (i=1 ; i<nTeam ; i++)
{
if (joined[i])
{
bestTeam = i;
isBreak = 0;
break;
}
}
if (isBreak != 0)
break;
for (i=1 ; i<nTeam ; i++)
{
if (joined[i])
{
if (team[i].solvedProblem > team[bestTeam].solvedProblem)
bestTeam = i; // 푼 문제수가 가장 많은 팀을 뽑는다
else if (team[i].solvedProblem == team[bestTeam].solvedProblem
&& team[i].timePenalty < team[bestTeam].timePenalty)
bestTeam = i;
else
continue;
}
}
cout << bestTeam << " " << team[bestTeam].solvedProblem << " "
<< team[bestTeam].timePenalty << endl;
joined[bestTeam] = false;
isBreak = 1;
}
}