23-07-28 TIL

more·2023년 7월 28일
0
  • 백준 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();
    }
}
profile
조금 더

0개의 댓글