두 명의 선수 A와 B가 경기에서 승리하기 위해 페널티 킥에 도전하는 상황을 가정해 보겠습니다. 네 개의 정수 변수 a, b, c, d가 주어지며, A가 먼저 페널티를 성공시킬 확률은 a/b, B가 먼저 페널티를 성공시킬 확률은 c/d로 주어집니다.
페널티를 먼저 성공시키는 선수가 경기에서 승리하게 되며, 문제의 요구 사항에 따라 프로그램은 A가 경기에서 승리할 확률을 계산해야 합니다.
입력 예시
a = 10, b = 20, c = 30, d = 40
출력 예시
probability is 0.5333
입력 예시
a = 1, b = 2, c = 10, d = 11
출력 예시
probability is 0.523
프로그램의 접근 방식
네 개의 정수 변수 a, b, c, d의 값을 입력받습니다.
A의 승리 확률 e = a/b와 B의 승리 확률 f = c/d를 계산한 뒤, 아래 공식을 적용하여 A가 최종적으로 승리할 확률을 구합니다.
e × (1 / (1 − (1 − f) × (1 − f)))
여기서 e는 A가 승리할 확률, f는 B가 승리할 확률을 의미하며, 이 공식은 경기가 여러 차례에 걸쳐 진행되는 상황까지 고려하여 A의 승리 확률을 보정해 줍니다.계산된 A의 승리 확률을 화면에 출력합니다.
알고리즘
시작
1단계 → 승리 확률을 계산하는 함수 선언
double probab_win(int a, int b, int c, int d)
double e = (double)a / (double)b 선언
double f = (double)c / (double)d 선언
return (e * (1 / (1 - (1 - f) * (1 - f))))
2단계 → main() 함수에서
int a = 10, b = 20, c = 30, d = 40 변수 선언
probab_win(a, b, c, d) 호출
종료예제 코드
#include <bits/stdc++.h>
using namespace std;
// 경기에서 승리할 확률을 계산하는 함수
double probab_win(int a, int b, int c, int d){
double e = (double)a / (double)b;
double f = (double)c / (double)d;
return (e * (1 / (1 - (1 - f) * (1 - f))));
}
int main(){
int a = 10, b = 20, c = 30, d = 40;
cout<<"probability is "<<probab_win(a, b, c, d);
return 0;
}출력
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
probability is 0.5333
이 알고리즘은 단순한 산술 연산만 수행하므로 시간 복잡도는 O(1)이며, 별도의 추가 메모리 없이 상수 공간 안에서 동작합니다.