본문 바로가기
백준

[JAVA] 백준 1344 - 축구

by 맴썰 2025. 10. 15.

https://www.acmicpc.net/problem/1344

5분에 한번씩 총 90분동안 18번의 슈팅을 할 때, 적어도 한 팀이 소수의 골을 넣을 확률을 구하는 문제이다.

적어도 한 팀이 소수의 골을 넣을 확률은  1 - (두 팀 중 어떤 팀도 소수의 골을 넣지 못할 확률)과 동일한 확률이다.

18 이하의 소수는 2,3,5,7,11,13,17이 있으니 

각 소수 prime[i] 에 대해 18Cprime[i] * 골 넣을확률 ^ prime[i] * 골을 넣지 못할 확률 ^ 18 - prime[i] 를 A팀, B팀에 대해 계산한 뒤에 합해주고, 

(1 - A팀이 소수 골을 넣을 확률) * (1 - B팀이 소수 골을 넣을 확률)을 계산해 어떤 팀도 소수의 골을 넣지 못할 확률을 계산 후 이 값을 1에서 빼주면 된다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int a = par(br.readLine());
        int b = par(br.readLine());
        double ap = (double) a /100;
        double bp = (double) b /100;

        double app = 0;
        double bpp = 0;
        long fact = getFact(18);
        int[] primes = {2,3,5,7,11,13,17};
        for (int temp : primes) {
            int rest = 18 - temp;
            long getComb = fact/(getFact(rest) * getFact(temp));
            double aRate = getComb * Math.pow(ap, temp) * Math.pow(1 - ap, rest);
            double bRate = getComb * Math.pow(bp, temp) * Math.pow(1 - bp, rest);
            app += aRate;
            bpp += bRate;
        }
        System.out.println(1-(1-app)*(1-bpp));
    }
    static long getFact(int a){
        if(a<=1) return 1L;
        return (long)a*getFact(a-1);
    }
    static int par(String s) {
        return Integer.parseInt(s);
    }

    static int[] getArray(String s) {
        return Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).toArray();
    }
}