[백준] 3758 KCPC - python

이윤진·2023년 8월 19일
0

알고리즘 연습

목록 보기
7/24

백준 3758 KCPC [링크]

문제

당신은 유명 프로그래밍 대회인 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. 최종 점수, 제출 횟수, 제출 시간 순으로 우선순위를 부여하기 때문에 python list의 sort 함수를 사용하여 쉽게 해결할 수 있을 것이라고 생각하였다.
  3. 최종 점수, 제출 횟수, 제출 시간 => 요소를 넣은 새로운 리스트를 만들어서 해결하면 쉬울 것 같다.

코드

# KCPC
# 최종점수, 제출 횟수, 제출 시간
import sys

case = int(sys.stdin.readline().rstrip())

for i in range(case):
    n, k, t, l = map(int, sys.stdin.readline().split(' '))
    score = [[0 for _ in range(k)] for _ in range(n)]
    submit = [0 for _ in range(n)]
    time = [0 for _ in range(n)] 

    for j in range(l):
        ex = list(map(int, sys.stdin.readline().split(' ')))
        score[ex[0]-1][ex[1]-1] = max(score[ex[0]-1][ex[1]-1], ex[2])
        submit[ex[0]-1] += 1
        time[ex[0]-1] = j
        
    line = []

    for h in range(n):
        line.append([sum(score[h]), submit[h], time[h], h])
    
    line.sort(key= lambda x : (-x[0], x[1], x[2]))

    for rank in range(n):
        if line[rank][3] == t - 1:
            print(rank+1)
profile
Android/Flutter 개발

0개의 댓글