개발자 톡
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))