[백준 / 3758 / KCPC / Java]

련지·2024년 8월 12일

코딩 테스트

목록 보기
8/9

오늘의 1솔 ♬

오늘의 문제는 백준의 KCPC !
바로 풀고 싶다면 요기로 → 문제 바로가기

문제 설명

  1. 당신은 대회에서 총 k개의 문제를 풀게 되며, 한 문제에 대한 풀이를 여러 번 제출할 수 있는데, 그 중 최고 점수가 그 문제에 대한 최종 점수가 된다
  2. 당신 팀의 최종 점수는 각 문제에 대해 받은 점수의 총합이고, 당신의 순위는 (당신 팀보다 높은 점수를 받은 팀의 수)+1 이다
  3. 점수가 동일한 팀이 여럿 있을 수 있는데, 그 경우에는 다음 규칙에 의해서 순위가 정해진다
    3-1. 최종 점수가 같은 경우, 풀이를 제출한 횟수가 적은 팀의 순위가 높다
    3-2. 최종 점수도 같고 제출 횟수도 같은 경우, 마지막 제출 시간이 더 빠른 팀의 순위가 높다

풀이

접근 방법

  1. 각 팀의 id, 문제에 대한 점수 배열, 점수 총합, 제출 횟수, 마지막 제출 시점을 저장하는 클래스를 만든다
  2. 우선순위에 따라 정렬되어야 하므로 Comparable 인터페이스를 implements하고, 문제에 제시된 우선순위 조건에 따라 compareTo 함수를 작성한다
  3. 각 로그들에 대해 아래 과정을 수행한다
    3-1. 이번에 J 번 문제에 대해 얻은 점수가 지금까지 J 번 문제 점수보다 높다면, 총점과 J 번 문제 점수를 갱신한다
    3-2. I 번째 팀의 마지막 제출 시점을 이번으로 갱신한다.
    3-3. I 번째 팀의 제출 횟수를 증가시킨다
  4. 각 팀들의 정보를 정렬한다.
    4-1. 클래스 내부 compareTo 함수에 따라 우선순위에 맞게 정렬된다.
  5. 정렬된 클래스 배열을 차례대로 조회하며 우리 팀 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)라고 뜬다
와싱톤이라니
시계는 와치 시계는 와치

profile
기술 블로그도 재미있을 수 있잖아요

0개의 댓글