본문 바로가기
코딩/백준-자바

[자바] 백준 3758번: KCPC

by 철없는민물장어 2023. 3. 5.
728x90
반응형

https://www.acmicpc.net/problem/3758

 

3758번: KCPC

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 번째 줄에는

www.acmicpc.net

Team클래스를 만들고,

Team[] list에 각 팀의 정보를 저장한 후

문제에서 제시한 조건대로 정렬하여 순위를 매기면 된다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class P3758 {

	static class Team {
		int id;
		int[] scoreList;
		int submitNum;
		int lastSubmit;
		int totalScore;

	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int testCase = Integer.parseInt(br.readLine());
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

		for (int T = 0; T < testCase; T++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int n = Integer.parseInt(st.nextToken()); // 팀 수
			int k = Integer.parseInt(st.nextToken()); // 문제수k
			int t = Integer.parseInt(st.nextToken()); // 내 팀ID
			int m = Integer.parseInt(st.nextToken()); // 로그개수

			Team[] list = new Team[n];
			for (int i = 0; i < m; i++) {
				// 로그수만큼 반복
				st = new StringTokenizer(br.readLine());
				int teamID = Integer.parseInt(st.nextToken());
				int problemNum = Integer.parseInt(st.nextToken());
				int score = Integer.parseInt(st.nextToken());

				if (list[teamID - 1] == null) {
					list[teamID - 1] = new Team();
					list[teamID - 1].id = teamID;
					list[teamID - 1].scoreList = new int[k + 1];
				}

				list[teamID - 1].scoreList[problemNum] = Math.max(score, list[teamID - 1].scoreList[problemNum]);
				list[teamID - 1].submitNum++;
				list[teamID - 1].lastSubmit = i;

			}
			for (int i = 0; i < n; i++) {
				int sum = 0;
				for (int j = 1; j <= k; j++) {
					sum += list[i].scoreList[j];
				}
				list[i].totalScore = sum;
			}

			Arrays.sort(list, new Comparator<Team>() {

				@Override
				public int compare(Team o1, Team o2) {
					// TODO Auto-generated method stub
					if (o1.totalScore == o2.totalScore) {
						if (o1.submitNum == o2.submitNum) {
							// 제출횟수는 적은게 좋다.
							return o1.lastSubmit - o2.lastSubmit;
						}
						return o1.submitNum - o2.submitNum;
					}
					return o2.totalScore - o1.totalScore;// 점수는 높은게 좋다.
				}
			});

			for (int i = 0; i < n; i++) {
				if (list[i].id == t) {
					// 내 팀 찾음
					bw.append(String.valueOf(i + 1) + "\n");
				}
			}
		}
		bw.flush();
		bw.close();
		br.close();
	}

}

입력받은 데이터를 잘 정리해서 정렬만 하면 되는 문제였다.

728x90
반응형

댓글