문제 링크

문제 요약

  • N명의 요들러가 K 라운드에 걸쳐 경연을 펼칩니다. 각 라운드마다 심사위원에게 점수를 부여받으며, 이 점수는 요들러의 총점에 누적됩니다.
  • 매 라운드가 끝날 때마다, 요들러들의 현재까지의 누적 총점을 기준으로 순위가 매겨집니다.
  • 이때 순위는 자신보다 높은 누적 총점을 가진 요들러가 j명이라면 j+1위가 됩니다 (즉, 동점자들은 모두 같은 순위를 가집니다).
  • 모든 라운드가 종료된 후, 최종 누적 총점이 가장 높은 “TopYodeller”를 찾아 출력해야 합니다.
    • TopYodeller의 참가 번호, 최종 총점, 그리고 경연 중 기록했던 가장 나쁜(숫자가 큰) 순위(worst rank)를 함께 출력해야 합니다.
    • 만약 TopYodeller가 여러 명이라면, 참가 번호가 작은 순서대로 모두 출력합니다.

풀이

이 문제는 각 요들러의 **현재까지의 총점(cumulative score)**과 경연 중 기록했던 최악의 순위(worst rank) 두 가지 정보를 K 라운드의 처리를 하면서 잘 관리하면 쉽게 해결할 수 있습니다.

정답 코드

def solve():
  n, k = map(int, input().split()) # n명, k라운드
 
  total_score = defaultdict(lambda : 0)
  worsk_rank = defaultdict(lambda : 0)
 
  for _ in range(k):
    scores = mii()
  
    for i, score in enumerate(scores):
      total_score[i + 1] += score
 
 
    d = sorted(list(set(total_score.values())), reverse=True)
    d = {v: i + 1 for i, v in enumerate(d)}
 
    for k, v in total_score.items():
      worsk_rank[k] = max(worsk_rank[k], d[v])
    
  max_total_score = max(total_score.values())
 
  for i in range(1, n + 1):
    if total_score[i] == max_total_score:
      print(f"Yodeller {i} is the TopYodeller: score {total_score[i]}, worst rank {worsk_rank[i]}")
 
if __name__ == "__main__":
  tc = 1
  for t in range(1, tc+1):
    ret = solve()
 

연관 페이지

참고 문헌 / 사이트