PS/BOJ

BOJ 1344 축구 [Java]

모달조아 2022. 9. 15. 21:03

BOJ 1344 축구

1. 문제 링크

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

2. 문제 해설

중고등학교 때 배웠던 확률 문제이다. 90분까지 5분 간격으로 구간을 나누므로 총 구간의 수는 18개이다.
A팀이 구간에서 골을 넣을 확률을 a라고 한다면,
경기 종료까지 A팀이 r골을 넣을 확률 = 18구간 중 골을 넣을 r개의 구간을 선택하는 경우의 수 x 선택된 경우의 수에서 r골을 넣을 확률
= 18Cr x a^r x (1-a)^(18-r) 이다.

18까지의 숫자 중 소수는 2, 3, 5, 7, 11 ,13, 17이므로 위 식에 적용하여 각 팀이 소수로 득점할 확률을 구할 수 있다.
A, B팀 중 적어도 한 팀이 골을 소수로 득점할 확률 = A팀이 소수로 득점할 확률 + B팀이 소수로 득점할 확률 - A, B팀이 모두 소수로 득점할 확률이다.

3. 코드 보기

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        double A = Double.parseDouble(br.readLine()) / 100.0;
        double B = Double.parseDouble(br.readLine()) / 100.0;
        double[] perA = new double[19]; // perA[i] = A팀이 i골을 넣을 확률
        double[] perB = new double[19];

        perA[1] = combination(18, 1) * Math.pow(A, 1) * Math.pow((1.0 - A), 17);
        perB[1] = combination(18, 1) * Math.pow(B, 1) * Math.pow((1.0 - B), 17);

        for (int i = 2; i < 19; i++) {
            perA[i] = combination(18, i) * Math.pow(A, i) * Math.pow((1.0 - A), 18 - i);
            perB[i] = combination(18, i) * Math.pow(B, i) * Math.pow((1.0 - B), 18 - i);
        }

        double primePerA = perA[2] + perA[3] + perA[5] + perA[7] + perA[11] + perA[13] + perA[17];
        double primePerB = perB[2] + perB[3] + perB[5] + perB[7] + perB[11] + perB[13] + perB[17];

        double answer = primePerA + primePerB - primePerA * primePerB;

        bw.write(Double.toString(answer));
        br.close();
        bw.flush();
        bw.close();
    }

    static int combination(int n, int r) {
        if (r == 0 || r == n) {
            return 1;
        }

        return combination(n - 1, r - 1) + combination(n - 1, r);
    }
}