알고리즘/백준

[Silver III] 우승자는 누구? - 5179 (python)

KimMinGyun 2024. 7. 5. 02:23

문제 링크

 

 

분류

구현, 정렬

 

문제 설명

대회가 끝이 나면 대부분의 참가자들은 어디서 꼬였는지에 대한 원망과 함께 좌절하게 된다.

심사위원들 또한 좌절한다. 제출 기록에 따라 각 참가자에게 점수를 매기고 순위를 산정해야 하기 때문이다.

비록 대회는 끝이 났지만 아직 코딩할 여력이 있다면, 심사위원들을 도울 순위 산정 프로그램을 만들어보자.

입력

첫 줄에 테스트 케이스의 수 K가 주어진다.

각 테스트 케이스의 첫 줄엔 세 개의 정수 M, N, P가 주어진다.

M은 대회에 사용된 문제의 개수이며 (1 ≤ M ≤ 10), N은 총 제출 수 (1 ≤ N ≤ 5000),

P는 참가자의 수 (1 ≤ P ≤ 500) 이다.

각 문제는 A, B, ... 로 이름붙여져 있으며, 참가자들은 1부터 P까지의 아이디를 갖는다.

이어 N개의 줄에 걸쳐 제출 기록의 내용이 주어진다.

제출 기록은 p m t j의 형식이며, p는 제출한 참가자(1, 2, ...) , m은 문제 번호(A, B, ..), t는 제출한 시각, j는 정답 여부이다.

j=0이라면 오답이며, j=1일 경우엔 정답이다.

제출 기록은 제출 시각이 감소하지 않는 순으로 주어진다.

문제를 맞힐 경우, 맞힌 사람은 총점에 문제를 맞힌 시각 + 그 문제를 틀린 횟수*20만큼을 더하게 된다.

만일 동일한 문제를 두 번 이상 맞히더라도 처음 맞힌 것만 인정된다.

출력

각 테스트 케이스마다 Data Set K: 를 출력한 뒤, 참가자들의 아이디, 푼 문제 수, 총점을 P줄에 걸쳐 1위부터 차례대로 출력한다.

순위는 푼 문제 수가 다르다면 푼 문제 수가 많은 사람이 높으며,

푼 문제 수가 같다면 총점이 낮은 사람이 순위가 높다.

어떤 테스트 케이스에서도 동점자가 나오는 경우는 없다.

각 테스트 케이스의 사이엔 빈 줄을 하나 출력한다.

 

 

코드

import sys
input = sys.stdin.readline

K = int(input())
for test in range(K):
    print(f'Data Set {test + 1}:')

    M, N, P = map(int, input().split())

    # 각 참가자의 제출 기록을 저장
    log = {}

    for _ in range(N):
        p, m, t, j = input().split()
        p = int(p)
        t = int(t)
        j = int(j)
        m_index = ord(m) - 65  # 문제 번호를 인덱스로 변환 (A=0, B=1, ...)

        if p not in log:
            log[p] = [[0] * M, [False] * M, 0]  # 문제 점수, 문제 정답 여부, 푼 문제 수

        # 문제를 맞힌 경우
        if j == 1 and not log[p][1][m_index]:
            log[p][1][m_index] = True  # 문제 정답 여부 갱신
            log[p][2] += 1
            log[p][0][m_index] += t

        # 문제를 틀린 경우
        elif j == 0 and not log[p][1][m_index]:
            log[p][0][m_index] += 20


    result = {}
    for k, v in log.items():
        total_time = 0
        for i in range(M):
            if v[1][i]:  # 문제를 맞힌 경우
                total_time += v[0][i]

        result[k] = (v[2], total_time)  # (푼 문제 수, 총점)

    # 푼 문제 수는 내림차순, 총점은 오름차순
    result_sort = sorted(result.items(), key=lambda x:(-x[1][0], x[1][1]))

    for i in result_sort:
        print(i[0], i[1][0], i[1][1])

    print()