백준 1072번(이분탐색) python

2023. 11. 18. 10:55알고리즘

 

 

 

♣ 시도1. 무식하게 수학식으로 도전!

 

 

더 게임한 횟수를 m으로 잡고, m을 1씩 늘려가면서 조건에 해당하는지 체크하는 방법이다. 보다시피 수학 식도 지저분하고 쓸데없는 부분까지 들어가있다. ( m을 1부터 시작하는 거니까 z+2와는 굳이 비교할 필요가 없다. ) 

시간제한이 없으면 정답 처리되겠지만 당연히 시간 초과로 나가리당했다. 

 

♣ 지저분한 수학식을 함수로 정리해서 도전!

지난 번 스터디에서 그냥 수학식을 푸는 것보다 함수를 정의한 후 함수를 사용하는 게 사용되는 시간을 줄일 수 있다는 것을 배웠다. 그래서 이번에는 지저분한 수학식을 함수로 정의한 후 사용했다. 

여전히 시간을 초과해서 실패!

 

♣ 이분탐색을 이용하여 도전!

본 문제는 이분탐색을 이용하여 해결해야 한다고 한다. 게임을 더 할 수 있는 최소 횟수와 최대 횟수를 범위로 두고, 반씩 잘라가면서 중간값을 게임을 추가로 한 횟수이자 추가로 이긴 횟수로 했을 때 승률이 z+1이 되는지 확인한다. 이 때 승률이 z+1보다 작으면 더 많이 게임을 해야 하므로 중간값을 최소 횟수로 설정한다. 승률이 z+1이 되면 게임을 더 적게 해도 승률이 z+1이 되는 횟수를 구해야 하므로 중간값을 최대 횟수로 설정한다. 이를 최소 횟수와 최대횟수가 같아질 때까지, 즉 더이상 범위를 반으로 나눌 수 없을 때까지 반복한다. 

 

또한 승률이 99%이면 아무리 게임을 더 많이 해도 100%는 될 수 없기 때문에(이미 앞에서 몇 개 틀려서 99%가 된 것이니까) -1을 출력한다. 

 

 

S: 추가 게임 최소 횟수

L: 추가 게임 최대 횟수

'알고리즘' 카테고리의 다른 글

백준 1541번 잃어버린 괄호  (1) 2023.12.06
백준 알고리즘 11659번(구간합 구하기)  (1) 2023.12.04
백준 1213번(팰린드롬 만들기)  (1) 2023.11.29
백준 1929  (1) 2023.11.16
백준 알고리즘 1920번  (0) 2023.11.08