PS(Problem Solving)/BOJ

[백준/BOJ] 3758번: KCPC

JunsuKim 2022. 3. 6.
728x90

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

 

3758번: KCPC

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 번째 줄에는

www.acmicpc.net

문제

당신은 유명 프로그래밍 대회인 KCPC(Korean Collegiate Programming Contest)에 참가하고 있다. 이 대회에서 총 k개의 문제를 풀게 되는데, 어떤 문제에 대한 풀이를 서버에 제출하면 그 문제에 대해 0점에서 100점 사이의 점수를 얻는다. 풀이를 제출한 팀의 ID, 문제 번호, 점수가 서버의 로그에 제출되는 시간 순서대로 저장된다. 한 문제에 대한 풀이를 여러 번 제출할 수 있는데, 그 중 최고 점수가 그 문제에 대한 최종 점수가 된다. (만약 어떤 문제에 대해 풀이를 한번도 제출하지 않았으면 그 문제에 대한 최종 점수는 0점이다.)

당신 팀의 최종 점수는 각 문제에 대해 받은 점수의 총합이고, 당신의 순위는 (당신 팀보다 높은 점수를 받은 팀의 수)+1 이다. 

점수가 동일한 팀이 여럿 있을 수 있는데, 그 경우에는 다음 규칙에 의해서 순위가 정해진다. 

  1. 최종 점수가 같은 경우, 풀이를 제출한 횟수가 적은 팀의 순위가 높다. 
  2. 최종 점수도 같고 제출 횟수도 같은 경우, 마지막 제출 시간이 더 빠른 팀의 순위가 높다. 

동시에 제출되는 풀이는 없고, 모든 팀이 적어도 한 번은 풀이를 제출한다고 가정하라. 

서버의 로그가 주어졌을 때, 당신 팀의 순위를 계산하는 프로그램을 작성하시오.

입력

입력 데이터는 표준 입력을 사용한다. 입력은 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이다. 

출력

출력은 표준출력을 사용한다. 주어진 각 테스트 데이터에 대해 당신 팀의 순위를 한 줄에 출력하여야 한다.

해설

문제에 푸는 법이 다 나와있다.

 

팀의 순위를 가리는 방법으로는

1. 최종 점수가 높은 팀이 이긴다.

2. 최종 점수가 같을 시 풀이를 제출한 횟수가 적은 팀이 이긴다.

3. 최종 점수와 제출 횟수가 같다면 마지막 제출 시간이 더 빠른 팀이 이긴다.

 

코드를 보면teamPerProblemScore - 팀이 푼 문제의 점수submitCnt - 제출 횟수lastSubmit - 마지막 제출 시간totalScore - 총점수이렇게 4개의 배열이 있다.

 

이 배열들에 각각 필요한 수들을 저장시킨 후 순위를 비교하면 된다.

소스 코드

import java.util.*

fun main()  = with(System.`in`.bufferedReader()) {
    val testCase = readLine().toInt()
    repeat(testCase) {
        var st = StringTokenizer(readLine())
        val teamNum = st.nextToken().toInt()
        val problemNum = st.nextToken().toInt()
        val myTeamID = st.nextToken().toInt()
        val log = st.nextToken().toInt()
        val teamPerProblemScore = Array(teamNum + 1) { IntArray(problemNum + 1) }
        val submitCnt = IntArray(teamNum + 1)
        val lastSubmit = IntArray(teamNum + 1)
        val totalScore = IntArray(teamNum + 1)
        repeat(log) {
            st = StringTokenizer(readLine())
            val teamID = st.nextToken().toInt()
            val problem = st.nextToken().toInt()
            val score = st.nextToken().toInt()
            if(teamPerProblemScore[teamID][problem] < score) teamPerProblemScore[teamID][problem] = score
            submitCnt[teamID]++
            lastSubmit[teamID] = it + 1
        }
        for(i in 1 .. teamNum){
            for(j in 1 .. problemNum) {
                totalScore[i] += teamPerProblemScore[i][j]
            }
        }
        var rank = 1
        for(i in 1 .. teamNum) {
            if(i == myTeamID) continue
            if(totalScore[i] > totalScore[myTeamID]) rank++
            if(totalScore[i] == totalScore[myTeamID]) {
                if(submitCnt[i] < submitCnt[myTeamID]) rank++
                if(submitCnt[i] == submitCnt[myTeamID]) {
                    if(lastSubmit[i] < lastSubmit[myTeamID]) rank++
                }
            }
        }
        println(rank)
    }
}
728x90

댓글