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

코드설명

정렬 문제입니다.

 

팀의 총합점수, 풀이횟수, 가장 최근에 풀이요청한 기록을 입력으로 저장한뒤에, 

따로 정렬할 배열을 만들어서 구현합니다.

 

이떄, 일반적으로는 Implements Comparable<Node> 와 같이 Comparable Interface를 구현해서 구현했었습니다.

이번에는 Comparator 인터페이스를 활용해서 배열을 쉽게 정렬할 수 있습니다. 익명함수를 사용했습니다.

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
 
public class Main {
	public static int N, C, H, W, K, M, T;
	public static int answer = 0;
	public static int[] logRequestCnt, logLatestRequestTime;
	public static int[][] logHighestScore; //[팀][문제의 개수] = 가장 높은점수
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		C = Integer.parseInt(st.nextToken());
		
		while(C-- > 0) {
			st = new StringTokenizer(br.readLine());
			N = Integer.parseInt(st.nextToken());
			K = Integer.parseInt(st.nextToken());
			T = Integer.parseInt(st.nextToken());
			M = Integer.parseInt(st.nextToken());
			
			
			logHighestScore = new int[N][K];
			logRequestCnt = new int[N];
			logLatestRequestTime = new int[N];
			for(int i=0;i<M; i++) {
				st = new StringTokenizer(br.readLine());
				int teamId = Integer.parseInt(st.nextToken()) - 1;
				int QuestId = Integer.parseInt(st.nextToken()) - 1;
				int score = Integer.parseInt(st.nextToken());
				
				logHighestScore[teamId][QuestId] = Math.max(logHighestScore[teamId][QuestId], score);
				logRequestCnt[teamId] += 1;
				logLatestRequestTime[teamId] = i;
			}
			
			int[][] forSort = new int[N][4];
			for(int i=0; i<N; i++) {
				forSort[i][0] = getAllScoreTeam(i);
				forSort[i][1] = logRequestCnt[i];
				forSort[i][2] = logLatestRequestTime[i];
				forSort[i][3] = i;
			}
			
			Arrays.sort(forSort, new Comparator<int[]>() {
				@Override
				public int compare(int[] arr1, int[] arr2) {
					if(arr1[0] == arr2[0]) {
						if(arr1[1] == arr2[1]) {
							if(arr1[2] == arr2[2]) {
								return 0;
							}
							return Integer.compare(arr1[2], arr2[2]);
						}
						return Integer.compare(arr1[1], arr2[1]);
					}
					return Integer.compare(arr2[0], arr1[0]);
				}
			});
			
			for(int i=0; i<forSort.length;i++) {
				if(forSort[i][3] == T - 1) {
					System.out.println((i+1));
				}
			}
			
		}
		
	}
	
	public static int getAllScoreTeam(int teamNum) {
		int ret = 0;
		for(int v : logHighestScore[teamNum]) {
			ret += v;
		}
		return ret;
	}
	
}

+ Recent posts