@@@ 알고리즘/백준 스터디

22353(헤이카카오) - 해결

HTG 2021. 8. 15. 00:34
728x90

헤이카카오

 

문제

일상을 바꾸는 단어, 헤이카카오는 카카오엔터프라이즈의 인공지능 플랫폼 Kakao i에 기반한 인공지능 비서 어플리케이션이다. 

헤이카카오를 사용하면 음악 검색, 길 찾기, 외국어 번역 등 다양한 기능들을 말 한 마디로 이용할 수 있다.

 

2020 헤이카카오 연말 결산에 따르면, 헤이카카오가 "고마워", "안녕" 다음으로 많이 들은 말은 "끝말잇기 하자"였다고 한다. 

방에서 핸드폰을 만지작거리던 이하도 심심풀이로 헤이카카오와 끝말잇기를 해 보기로 했다.

 

이하는 끝말잇기를 가볍게 여러 판 플레이하고 통계를 냈다. 

그 결과 끝말잇기를 한 판 하는 데에는 a분이 걸리며, 현재 자신이 이길 확률은 d%라는 사실을 알게 되었다. 

이하는 자신의 승률에 실망하고 이제 집중해서 플레이를 하기로 했다. 이하가 집중하면 끝말잇기에서 패배할 때마다 경험이 쌓여 

이길 확률이 이전에 비해 k%만큼 오른다. 만약 이렇게 증가한 확률이 100%를 넘게 되면, 이하는 다음 판부터는 반드시 승리한다.

 

이하는 헤이카카오를 한 번 이길 때까지 끝말잇기를 하려고 한다. 이하가 끝말잇기를 진행하는 시간의 기댓값을 구해 보자.

 

입력

첫 번째 줄에는 세 개의 정수 a, d, k가 공백으로 구분되어 주어진다.(1<= a,d,k <= 100)  

이는 끝말잇기 한 판에 a분이 걸리며 집중을 시작한 이하가 처음에 끝말잇기에서 이길 확률이 d%이고 패배할 때마다 승률이 

이전에 비해 k%만큼 오름을 의미한다.

 

입력으로 주어지는 값은 모두 정수이다.

 

출력

이하가 이길 때까지 끝말잇기를 진행하는 시간의 기댓값을 분 단위로 출력한다. 

절대오차 또는 상대오차가  10^(-6)이하면 정답으로 인정된다.


이 문제는 수학적으로 푸는 문제라 그렇게 어렵진 않았다.

다만 기댓값데 대한 정의에 대해 알아야 풀 수 있다.기댓값이란 각 사건이 벌어졌을 때의 이득과 그 사건이 벌어질 확률을 곱한 것을 전체 사건에 대해 합한 값이다.그렇게 때문에 예시의 1 50 50 같은 경우 1. 1*1*(1/2)2. 2*1*(1-1/2)*(1/2)*(1+1/2)3. 3*1*(1-1/2)*(1-(1/2)*(1+1/2))*((1/2)*(1+1/2))*(1+1/2)이렇게 하였다.100%가 넘는 시점까지만 구하면 되기 때문에 그때까지의 값을 저장한다.

import sys

a, d, k = map(int,sys.stdin.readline().split())
# 백분율로 변환
d = d/100
k = k/100
# 기댓값 저장
ex = 0
# 횟수 저장
n = 1
# 해당 시점 확률
per = d
# 이전 시점까지의 확률
toper = 1

while 1:
    # 기댓값저장.
    ex += a*n*toper*per

    # 100%가 넘으면 정지
    if per == 1:
        break

    # 이전까지의 확률이기때문에 
    # 해당 시점에서 실패 확률을 전까지의 확률과 곱
    toper = toper*(1-per)
    # 해당 시점 확률
    per = per*(1+k)
    # 횟수 증가
    n += 1
    # 100가 넘으면 100로 고정
    if per > 1:
        per = 1

print(ex)