개발자 톡

연습문제 톡 루돌프 월드컵

python으로 해봤습니다.

등록일
2025-01-07 17:04:39
조회수
58
작성자
jcm5900

import sys

import itertools

from decimal import Decimal, ROUND_HALF_UP

input= sys.stdin.readline


dic=[]

F=list(map(int,input().strip().split(" ")))


#1vs2  1vs3   1vs4   2vs3  2vs4   3vs4

daejin=[(0,1),(0,2),(0,3),(1,2),(1,3),(2,3)]

for x,y in daejin:

  a,b=F[x],F[y]

  dic.append([4*a/(5*(a+b)),(a+b)/(5*(a+b)),4*b/(5*(a+b))])


#모든 경우의수를 다 stack에 넣는다 3^6으로 721개나 함.

#각 6개의대결에서 0vs1일경우 1이면 전자승 0이면 후자승

    #0번이 2등안에 들만한 2채원배열을 스택으로 누적

#그래서[[1,1,1,0,0,0]] 스택 pop()에따라 (이런 결과가 일어날 확률)을 누적하는게 정답.


stack = [list(item) for item in itertools.product(range(3), repeat=6)] #3진수 행렬생성


def process1(cases):

  scores=[0,0,0,0]

   

  for idx,res in enumerate(cases):

    if res==0: # 0이면 전자3점, 1이면 둘다1점, 2면 후자3점

      scores[daejin[idx][0]]+=3

    if res==1:

      scores[daejin[idx][0]]+=1

      scores[daejin[idx][1]]+=1

    if res==2:

      scores[daejin[idx][1]]+=3

  return scores


ans=[]

for i in stack:

  #각각의 점수를 산출하여

  scores=process1(i)

  if max(scores)==scores[0]:

    ans.append(i)

  else:

    if sorted(scores,reverse=True)[1]==scores[0]:

      ans.append(i)

#print(len(ans)) #경우의수가 421가지 (근데 이건 무게와 상관없음)


def get_per(cases2):

  per=1

  for idx,game in enumerate(cases2):

    per*=dic[idx][game]

  return per

answer=0

for games in ans:

  answer+=get_per(games)


def deci_round(value):

  decimal_value = Decimal(str(value)).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)

  return decimal_value


print(deci_round(answer*100))

#루돌프_월드컵

이 카테고리의 톡 더보기