[백준/파이썬] 11070번 풀이

업데이트:



문제 정보


풀이

문제

유명한 피타고라스의 정리와 유사한 형태의 피타고라스 기댓값 (Pythagorean Expectation)이 야구와 같은 스포츠 경기에 자주 사용된다. 피타고라스 기댓값은 빌 제임스(Bill James)에 의해 정의되었으며, 이 값은 특정 야구팀이 한 시즌 동안 얼마나 잘 했는지를 평가하는 지표 중 하나로 사용된다. 한 야구팀의 피타고라스 기댓값 (W)는 아래 식과 같이 정의된다.

(W = \dfrac{S^2}{S^2 + A^2}),

여기서 (S)는 해당 팀의 총 득점 수를, (A)는 해당 팀의 총 실점 수를 나타낸다.

이 기댓값을 실제 승률과 비교하여, 해당 팀이 한 시즌을 얼마나 잘 보냈는지 평가할 수 있다. 예를 들어, 한화 이글스는 2014 시즌에 619 득점과 889 실점을 했다. 즉, (S) = 619, (A) = 889이 되어, 한화 팀의 피타고라스 기댓값은 (W) = 6192/(6192 + 8892) = 0.326이 된다. …

입력 요약
입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫 줄에는 두 양의 정수 (n) (2 ≤ (n) ≤ 1,000)과 (m) (2 ≤ (m) ≤ 1,000)이 주어진다. 여기서, (n)은 팀 개수이며, (m)은 전체 경기 수이다. 다음의 (m)개의 줄에는 각 경기에 대한 정보가 주어진다. …

출력 요약
출력은 표준 출력을 사용한다. 각 테스트 데이터에 대해, 두 정수 값을 한 줄에 하나씩 출력해야 한다. 첫 번째 줄에는 최대 피타고라스 기댓값에 1,000을 곱한 값의 정수부분을 출력하고, 두 번째 줄에는 최소 피타고라스 기댓값에 1,000을 곱한 값의 정수부분을 출력한다.

코드

# 한화의~ 김성근~ 감 독 님 사 랑해~
import sys; read = sys.stdin.readline
import math

result = []
for T in range(int(read())):
    n, m = map(int, read().split())
    teams = {i:[0, 0] for i in range(1, n + 1)}

    for _ in range(m):
        a, b, p, q = map(int, read().split())
        teams[a][0] += p
        teams[a][1] += q
        teams[b][0] += q
        teams[b][1] += p
        
    pes = [((teams[i][0] ** 2 / (teams[i][0] ** 2 + teams[i][1] ** 2))
            if teams[i][0] + teams[i][1] > 0
            else 0) for i in range(1, n + 1)]
            
    result.append(math.floor(max(pes) * 1000))
    result.append(math.floor(min(pes) * 1000))

print('\n'.join(map(str, result)))

설명

핵심은 구현 관점에서 유명한 피타고라스의 정리와 유사한 형태의 피타고라스 기댓값 (Pythagorean Expectation)이 야구와 같은 스포츠 경기에 자주 사용된다. …를 만족하도록 로직을 구성하는 것입니다.

코드는 입력을 파싱한 뒤 조건 분기와 계산을 순서대로 수행하고, 문제에서 요구한 형식으로 결과를 출력합니다.

경계값과 예외 케이스도 함께 고려해 오답이 나기 쉬운 상황을 방지합니다.



이런 주제는 어떠신가요?

비슷한 난이도와 유형의 문제를 이어서 보면 풀이 감각을 더 빠르게 잡기 좋습니다.

댓글남기기