문제 링크
문제 요약
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()