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;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 5567 결혼식 - BFS(너비우선탐색) + DFS(깊이우선탐색) JAVA (0) | 2024.08.30 |
---|---|
[백준] 4963 섬의 개수 - DFS(깊이우선탐색) JAVA (0) | 2024.08.29 |
[백준] 2644 촌수계산 - DFS(깊이우선탐색) + 비트마스킹(BitMask) JAVA (0) | 2024.08.28 |
[백준] 1793 타일링 - 동적계획법(DynamicProgramming) + 임의 정밀도 / 큰 수 연산(BigInteger) JAVA (0) | 2024.08.23 |
[백준] 1058 친구 - BFS(너비우선탐색) + DFS(깊이우선탐색) + 플로이드–워셜(Floywd Warshall) JAVA (0) | 2024.08.20 |