
2025.05.18
오늘한 내용 : 파이썬 알고리즘 문제 풀이
WEEK 10 정글 끝까지(PintOS) - UserProgram
import sys
input = sys.stdin.readline
w, l, d = map(float, input().split())
dp = [[0.0 for _ in range(4001)] for _ in range(21)]
dp[0][2000] = 1.0
for i in range(20):
for score in range(1000,3001,50): # 50단위로 변하는 점수들
if dp[i][score] > 0:
# 여러 경로를 통해 확률이 증가될 수 있으니 += 사용
if score + 50 <= 3000:
dp[i+1][score + 50] += dp[i][score] * w
dp[i+1][score] += dp[i][score] * d
if score - 50 >= 1000:
dp[i+1][score - 50] += dp[i][score] * l
print(f"{sum(dp[20][1000:1500]):.8f}")
print(f"{sum(dp[20][1500:2000]):.8f}")
print(f"{sum(dp[20][2000:2500]):.8f}")
print(f"{sum(dp[20][2500:3000]):.8f}")
print(f"{sum(dp[20][3000:3500]):.8f}")
문제를 보자마자 어떻게 풀지 생각한 문제.
혼자서 못풀고 도움을 좀 받았다.
dp 테이블 세로축 = 횟수 / 가로축 = 점수 / 값 = 확률 로 테이블을 구성한뒤
dp[0][2000] 을 1.0 으로 시작하고 횟수가 증가할 때마다 승 패 무의 확률을 갱신해준다.
출력할때도 f 포맷을 활용해 소숫점8자리까지만 표현해야하는 좀 어려웠던 문제.
그냥 DP문제는 익숙해지지가 않는다. 컴퓨터하는 사람들은 다들 천재다.