📖 오늘의 학습 키워드
이분탐색
[K-th Smallest Prime Fraction]
https://leetcode.com/problems/k-th-smallest-prime-fraction/description/
class Solution {
public int first, second;
public int[] kthSmallestPrimeFraction(int[] arr, int k) {
int[] answer = new int[2];
double left = 0;
double right = 1;
while(left <= right) {
double mid = (left + right) / 2;
if(calculate(mid ,arr) == k) {
answer[0] = arr[first];
answer[1] = arr[second];
break;
}
else if(calculate(mid ,arr) > k) {
right = mid;
}
else {
left = mid;
}
}
return answer;
}
public int calculate(double mid, int[] arr) {
int idx = 0;
int j = 1;
double max = 0;
for(int i = 0; i < arr.length; i++) {
while(j < arr.length && arr[i] /(double)arr[j] >= mid) {
j++;
}
idx += arr.length - j;
if(j < arr.length && max < arr[i] /(double)arr[j]) {
max = arr[i] /(double)arr[j];
first = i;
second = j;
}
}
return idx;
}
}
left는 0, right는 1로 초기화한다. left와 right로 임의의 분수를 구한다.
이분탐색을 진행한다.
1) 임의의 분수 값인 mid를 left와 right의 반값으로 구한다.
2) arr 배열로 만들 수 있는 분수 값 중 mid 값보다 작거나 같은 것의 개수를 찾는다.
3) mid보다 작거나 같은 값들의 개수가 k와 같다면 위의 과정에서 찾은 최대값의 분자와 분모 값을 반환한다.
4) k보다 크다면, mid 값이 더 작아져 개수를 줄여야 한다. right를 mid로 한다.
5) k보다 작다면, mid 값이 더 커져야 한다. left를 mid로 한다.