- 백준 3758 (KCPC) - Java
- 순위 계산을 어떻게 하나 예시를 보았더니 그냥 총 점수를 합쳐서 계산하는 것이였다.
- 따라서 각 팀 별, 각 문제 별로 점수를 저장했다가 다 더해서 비교하면 되는 문제였고
- 그 총 점수를 가지고 현재 내 팀의 점수와 다른 팀 점수를 비교해서 순위를 + 1 해주면 된다.
- 다만 점수가 동일하다면 두 가지 조건을 적용해야 한다.
- 최종 점수가 같은 경우, 풀이를 제출한 횟수가 적은 팀의 순위가 높다.
- 최종 점수도 같고 제출 횟수도 같은 경우, 마지막 제출 시간이 더 빠른 팀의 순위가 높다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 총 테스트 케이스의 수를 받아야 한다.
int testCase = Integer.parseInt(br.readLine());
for (int i = 0; i < testCase; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// 팀 갯수
int teamNumber = Integer.parseInt(st.nextToken());
// 문제 갯수
int problemNumber = Integer.parseInt(st.nextToken());
// 내가 속한 팀
int myTeamNumber = Integer.parseInt(st.nextToken());
// 총 기록 갯수 -> 총 제출 수
int logEntry = Integer.parseInt(st.nextToken());
// 각 팀, 각 문제별로 점수를 저장할 배열
int[][][] score = new int[teamNumber][problemNumber][1];
// 팀 별 총합 (테스트 케이스 별)
int[] sum = new int[teamNumber];
// 팀 별 총 정답 제출 횟수
int[] submitCount = new int[teamNumber];
// 팀 별 마지막 제출 순서
int[] lastSubmit = new int[teamNumber];
// 배열 초기화
for (int j = 0; j < teamNumber; j++)
for (int k = 0; k < problemNumber; k++)
score[j][k][0] = 0;
for (int j = 0; j < logEntry; j++) {
st = new StringTokenizer(br.readLine(), " ");
// 현재 제출한 팀
int currTeam = Integer.parseInt(st.nextToken());
// 현재 제출한 문제
int currProblem = Integer.parseInt(st.nextToken());
// 현재 제출한 문제의 점ㅈ수
int currScore = Integer.parseInt(st.nextToken());
// 현재 제출한 팀의 현재 문제의 점수 비교
// 예전 값보다 크면 다시 저장
if (score[currTeam - 1][currProblem - 1][0] < currScore)
score[currTeam - 1][currProblem - 1][0] = currScore;
// 제출 횟수 + 1
submitCount[currTeam - 1]++;
// 마지막으로 제출한 순서 업데이트
lastSubmit[currTeam - 1] = j;
}
// 각 팀의 점수 합
for (int j = 0; j < teamNumber; j++)
for (int k = 0; k < problemNumber; k++)
sum[j] += score[j][k][0];
// 순위
int res = 1;
for (int j = 0; j < teamNumber; j++) {
// 내가 속한 팀의 점수 합이 현재 팀의 점수 합 보다 작으면 순위 + 1
if (sum[myTeamNumber - 1] < sum[j])
res++;
// 내가 속한 팀의 점수 합이 현재 팀의 점수 합과 같으면 -> 제출 횟수 비교
else if (sum[myTeamNumber - 1] == sum[j]) {
// 제출 횟수가 많으면 순위 + 1
if (submitCount[myTeamNumber - 1] > submitCount[j])
res++;
// 제출 횟수가 같으면 -> 마지막 제출 순서 비교
else if (submitCount[myTeamNumber - 1] == submitCount[j]) {
// 마지막 제출 순서가 더 늦으면 순위 + 1
if (lastSubmit[myTeamNumber - 1] > lastSubmit[j])
res++;
}
}
}
// 출력
bw.write(res + "\n");
}
bw.flush();
bw.close();
br.close();
}
}