https://www.acmicpc.net/problem/1072

승률이 달라지기위한 게임 횟수를 구하는 문제였다.
처음엔 1부터 탐색했는데 생각해보니 X의 범위를 고려했을 때 최악의 경우 10억까지 탐색해야 했다. O(N)
따라서 이분탐색으로 풀어야 하는 문제였다. O(logN)
package STUDY;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Day01_BOJ_1072 {
static int x, y;
static int res;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
res = (int)((long) y * 100 / x); // 초기 승률
int left = 0;
int right = 1000000000;
int ans = -1;
while(left <= right){
int mid = (left + right) / 2;
int tmp = (int)((long)(y+mid) * 100 / (x+mid));
if(tmp != res){
ans = mid;
right = mid - 1;
}else{
left = mid + 1;
}
}
System.out.println(ans);
}
}
1. mid를 left와 right 중간 값으로 둔다.
2. 계산한 승률값이 초기 승률과 달라지면 mid보다 작은 범위에서 탐색해야 하므로 ans = mid로, right = mid - 1 로 설정한다.
3. 계산한 승률값이 초기 승률과 같다면 mid보다 큰 범위에서 탐색해야 하므로 left = mid + 1로 설정한다.
4. 설정한 범위가 교차하면 끝내면 된다!
'코테 > 백준' 카테고리의 다른 글
99클럽 코테 스터디 2일차 TIL 이분탐색(징검다리) (1) | 2024.10.29 |
---|---|
[BOJ] 2776 암기왕 (Java) (0) | 2024.10.28 |
[BOJ] 2644 촌수계산 (Java) (0) | 2023.04.30 |
[BOJ] 14503 로봇청소기 (Java) (0) | 2023.04.30 |
[BOJ] 1260 DFS와 BFS (Java) (0) | 2023.04.30 |