1. 문제유형
2. 자료구조
- 중요한 점은 y/x * 100과 같이 실수형으로 계산 후 int로 바꿔줄 시 정확하지 않을 수 있다.
- 따라서 실수형 계산이 아닌, y * 100//x처럼 정수형 계산으로 바꿔 승률을 계산해야 한다.
- z (int): 초기 승리한 게임 수 y/전체 게임 수 x * 100
- target (int): 승리한 경기수를 이분탐색하며 계산한 승률
- left (int): 더해나갈 승리한 횟수의 최소값
- right (int): 더해나갈 승리한 횟수의 최대값
- mid (int): (left+right)//2 == 중간값으로 실제 더할 승리한 횟수
3. 해결과정
- 승리한 게임 수를 찾는 게 핵심이며, 범위는 0부터 x(10 ** 9)까지이다.
- 따라서 1부터 적용할 경우 10억 번 연산이 필요하므로 이분탐색을 사용한다.
- x,y에 mid를 더한 후 승률을 계산한다.
- 승률이 초기 승률값과 같다면 left = mid+1
- 승률이 초기 승률값보다 크다면 answer=mid 후 right = mid-1
- 3-5를 left <= right일 동안 반복한다.
- 반복이 끝난 후 승률이 초기값과 같다면 -1을, 아니라면 answer를 출력한다.
x, y = map(int, input().split())
left, right = 0, x
answer = 0
z = y*100//x
while left<=right:
mid = (left+right)//2
game = x + mid
win = y + mid
target = win*100//game
if z == target:
left = mid + 1
else:
answer = mid
right = mid - 1
x, y = x+answer, y+answer
result = y*100//x
if result == z:
print(-1)
else:
print(answer)