[알고리즘 문제 풀기] 축구(1344)

C#
lhs's avatar
Apr 03, 2025
[알고리즘 문제 풀기] 축구(1344)
notion image

1. 문제 풀이 아이디어

  • 18번의 시도에서 소수 개수만큼 성공할 확률을 제외하여 각각의 실패 확률을 구한 후, 두 확률의 곱을 이용해 전체 실패 확률을 구한다.
  • 최종적으로 1에서 전체 실패 확률을 빼서 원하는 확률을 계산한다.

2. 나의 정답 코드

using (StreamReader sr = new StreamReader(Console.OpenStandardInput())) using (StreamWriter sw = new StreamWriter(Console.OpenStandardOutput())) { int[] prime = { 2, 3, 5, 7, 11, 13, 17 }; double a = double.Parse(sr.ReadLine()) / 100.0; double b = double.Parse(sr.ReadLine()) / 100.0; double ap = 1; double bp = 1; for (int i = 0; i < prime.Length; i++) { int cur = prime[i]; ap -= CB(18, cur) * Math.Pow(a, cur) * Math.Pow(1 - a, 18 - cur); bp -= CB(18, cur) * Math.Pow(b, cur) * Math.Pow(1 - b, 18 - cur); } sw.WriteLine(1 - ap * bp); long CB(int n, int r) { long result = 1; for (int i = 1; i <= r; i++) result = result * (n - r + i) / i; return result; } }

3. 정리

  • CB(n, r) 함수는 조합(combination) 계산을 수행한다.
  • apbp는 각각 특정 횟수만큼 성공하지 않을 확률을 구하는 데 사용된다.
  • 최종적으로 1 - ap * bp를 출력하여 두 경우 중 하나 이상 성공할 확률을 구한다.
Share article

LHS's Study Space