https://www.acmicpc.net/problem/3758
문제
당신은 유명 프로그래밍 대회인 KCPC(Korean Collegiate Programming Contest)에 참가하고 있다. 이 대회에서 총 k개의 문제를 풀게 되는데, 어떤 문제에 대한 풀이를 서버에 제출하면 그 문제에 대해 0점에서 100점 사이의 점수를 얻는다. 풀이를 제출한 팀의 ID, 문제 번호, 점수가 서버의 로그에 제출되는 시간 순서대로 저장된다. 한 문제에 대한 풀이를 여러 번 제출할 수 있는데, 그 중 최고 점수가 그 문제에 대한 최종 점수가 된다. (만약 어떤 문제에 대해 풀이를 한번도 제출하지 않았으면 그 문제에 대한 최종 점수는 0점이다.)
당신 팀의 최종 점수는 각 문제에 대해 받은 점수의 총합이고, 당신의 순위는 (당신 팀보다 높은 점수를 받은 팀의 수)+1 이다.
점수가 동일한 팀이 여럿 있을 수 있는데, 그 경우에는 다음 규칙에 의해서 순위가 정해진다.
- 최종 점수가 같은 경우, 풀이를 제출한 횟수가 적은 팀의 순위가 높다.
- 최종 점수도 같고 제출 횟수도 같은 경우, 마지막 제출 시간이 더 빠른 팀의 순위가 높다.
동시에 제출되는 풀이는 없고, 모든 팀이 적어도 한 번은 풀이를 제출한다고 가정하라.
서버의 로그가 주어졌을 때, 당신 팀의 순위를 계산하는 프로그램을 작성하시오.
입력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 번째 줄에는 팀의 개수 n, 문제의 개수 k, 당신 팀의 ID t, 로그 엔트리의 개수 m을 나타내는 4 개의 정수가 주어진다. 여기서, 3 ≤ n, k ≤ 100, 1 ≤ t ≤ n, 3 ≤ m ≤ 10,000이다. 그 다음 m개의 줄에는 각 풀이에 대한 정보가 제출되는 순서대로 주어진다. 각 줄에는 팀 ID i, 문제 번호 j, 획득한 점수 s를 나타내는 세 개의 정수가 주어진다. 여기서 1 ≤ i ≤ n, 1 ≤ j ≤ k, 0 ≤ s ≤ 100이다.
출력
출력은 표준출력을 사용한다. 주어진 각 테스트 데이터에 대해 당신 팀의 순위를 한 줄에 출력하여야 한다
🔵풀이
그냥 조건에 맞게 잘 정렬하여 등수를 출력하면 됩니다. static 클래스로 Team 클래스를 만든 후에 이를 정렬해주었습니다. 더 빠른 방법이 있을 거 같은데 혹시 더나은 방법이 있다면 알려주시면 감사하겠습니다!!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.valueOf(br.readLine());
for (int i=0; i<T; i++){
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
int n = Integer.valueOf(stringTokenizer.nextToken());
int k = Integer.valueOf(stringTokenizer.nextToken());
int d = Integer.valueOf(stringTokenizer.nextToken());
int log = Integer.valueOf(stringTokenizer.nextToken());
ArrayList<Team> arrayList = new ArrayList<>();
HashMap<Integer, Team> hashMap = new HashMap<>();
for (int j=0; j<log; j++){
stringTokenizer = new StringTokenizer(br.readLine());
int teamNum = Integer.valueOf(stringTokenizer.nextToken());
int problemNum = Integer.valueOf(stringTokenizer.nextToken());
int score = Integer.valueOf(stringTokenizer.nextToken());
if (hashMap.containsKey(teamNum)){
Team team = hashMap.get(teamNum);
team.submitCount++;
if (team.score[problemNum]<score){
team.sumScore-=team.score[problemNum];
team.sumScore+=score;
team.score[problemNum] = score;
}
team.lastLog = j;
continue;
}
Team team = new Team();
team.num = teamNum;
team.submitCount = 1;
team.lastLog = j;
team.sumScore = score;
team.score = new int[k+1];
team.score[problemNum] = score;
arrayList.add(team);
hashMap.put(teamNum, team);
}
int answer = rank(d, arrayList,hashMap);
System.out.println(answer);
}
}
static int rank(int d, ArrayList<Team> teams, HashMap<Integer,Team> hashMap){
Collections.sort(teams, new Comparator<Team>() {
@Override
public int compare(Team o1, Team o2) {
if (o2.sumScore==o1.sumScore){
if (o1.submitCount==o2.submitCount){
return o1.lastLog-o2.lastLog;
}
return o1.submitCount-o2.submitCount;
}
return o2.sumScore- o1.sumScore;
}
});
return teams.indexOf(hashMap.get(d))+1;
}
static class Team{
int num;
int submitCount;
int sumScore;
int[] score;
int lastLog;
}
}
'알고리즘' 카테고리의 다른 글
백준 19637번 : IF문 좀 대신 써줘(자바) (0) | 2024.07.30 |
---|---|
백준 2607번 : 비슷한 단어(자바) (1) | 2024.07.26 |
백준 17484번 : 진우의 달 여행 (Small) (자바) (4) | 2024.07.24 |
백준 1515번 : 수 이어 쓰기 (자바) (0) | 2024.07.22 |
백준 2512번 : 예산 (자바) (1) | 2024.07.20 |