매일 BOJ
(매일 BOJ) C++ 1072번 게임
norepinephrine
2025. 7. 27. 13:44
이번 문제는 1072번 게임이다.

접근법
이 문제는 정수 승률이기 때문에 변화가 일어나지 않을 수도 있다. 예를 들어,
- 현재 승률이 80%일 때, 1~수십 판 이겨도 여전히 정수 승률은 80%일 수 있다.
또한, 최대 10억 판 이상을 더 해야 바뀔 수도 있으므로 완전 탐색은 불가능하다.
따라서 이진 탐색(Binary Search)을 이용한다.
알고리즘 설계
- 현재 승률 Z를 계산한다: Z = (Y * 100) / X
- Z가 99 이상이면, 승률은 절대 1 이상 증가할 수 없으므로 -1 출력
- 1부터 10억까지 이분 탐색 범위를 설정
- mid값을 더 이긴 경기 수로 가정하고, 새로운 승률을 계산
- 새 승률이 Z보다 크면 정답 후보로 저장하고, 더 적은 mid를 탐색
- 아니면 mid를 증가시킴
- 최솟값을 찾아 출력
작성코드
# include <bits/stdc++.h>
using namespace std;
int main (void){
ios::sync_with_stdio(0); cin.tie(0);
long long game_play, win;
cin >> game_play >> win;
int z = 100 * win / game_play;
if (z >= 99) {
cout << -1;
return 0;
}
long long start = 1, end = game_play;
long long answer = 0;
while (start <= end){
long long mid = (start + end) / 2;
long long new_z = (100 * (win + mid)) / (game_play + mid);
if(new_z > z){
answer = mid;
end = mid - 1;
}
else{
start = mid + 1;
}
}
cout << answer;
}