
오늘의 문제는 백준의 KCPC !
바로 풀고 싶다면 요기로 → 문제 바로가기
- 당신은 대회에서 총 k개의 문제를 풀게 되며, 한 문제에 대한 풀이를 여러 번 제출할 수 있는데, 그 중 최고 점수가 그 문제에 대한 최종 점수가 된다
- 당신 팀의 최종 점수는 각 문제에 대해 받은 점수의 총합이고, 당신의 순위는 (당신 팀보다 높은 점수를 받은 팀의 수)+1 이다
- 점수가 동일한 팀이 여럿 있을 수 있는데, 그 경우에는 다음 규칙에 의해서 순위가 정해진다
3-1. 최종 점수가 같은 경우, 풀이를 제출한 횟수가 적은 팀의 순위가 높다
3-2. 최종 점수도 같고 제출 횟수도 같은 경우, 마지막 제출 시간이 더 빠른 팀의 순위가 높다
- 각 팀의 id, 문제에 대한 점수 배열, 점수 총합, 제출 횟수, 마지막 제출 시점을 저장하는 클래스를 만든다
- 우선순위에 따라 정렬되어야 하므로
Comparable인터페이스를 implements하고, 문제에 제시된 우선순위 조건에 따라compareTo함수를 작성한다- 각 로그들에 대해 아래 과정을 수행한다
3-1. 이번에J번 문제에 대해 얻은 점수가 지금까지J번 문제 점수보다 높다면, 총점과J번 문제 점수를 갱신한다
3-2.I번째 팀의 마지막 제출 시점을 이번으로 갱신한다.
3-3.I번째 팀의 제출 횟수를 증가시킨다- 각 팀들의 정보를 정렬한다.
4-1. 클래스 내부compareTo함수에 따라 우선순위에 맞게 정렬된다.- 정렬된 클래스 배열을 차례대로 조회하며 우리 팀 id와 동일한 팀을 만나면
해당 인덱스+1을 출력한다
package a2408;
import java.io.*;
import java.util.*;
public class d12_bj_s2_3758_KCPC {
static class Team implements Comparable<Team>{
int id;
int[] score;
int total;
int count;
int last;
public Team(int id, int size){
this.id = id;
this.score = new int[size];
this.total = 0;
this.count = 0;
this.last = 0;
}
@Override
public int compareTo(Team o){
if(o.total < total){ return -1; }
if(o.total > total){ return 1; }
if(count < o.count){ return -1; }
if(count > o.count){ return 1; }
return Integer.compare(last, o.last);
}
}
public static void main(String[] args) throws Exception{
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int TC = Integer.parseInt(br.readLine());
for(int tc=0; tc<TC; tc++){
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
Team[] teams = new Team[N+1];
for(int n=0; n<=N; n++){ teams[n] = new Team(n, K+1); }
for(int m=0; m<M; m++){
st = new StringTokenizer(br.readLine());
int I = Integer.parseInt(st.nextToken());
int J = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
if(teams[I].score[J] < S){
teams[I].total = teams[I].total - teams[I].score[J] + S;
teams[I].score[J] = S;
}
teams[I].last = m;
teams[I].count++;
}
Arrays.sort(teams);
for(int n=0; n<=N; n++){
if(teams[n].id == T){
sb.append(n+1).append("\n");
break;
}
}
}
System.out.println(sb);
}
}
문제에서는 KCPC가 Korean Collegiate Programming Contest라고 했는데 검색하니까 와싱톤 중앙 장로 교회(Korean Central Presbyterian Church)라고 뜬다
와싱톤이라니
시계는 와치 시계는 와치
