Leetcode Java K-th Smallest Prime Fraction
업데이트:
문제
코드
class Solution {
public int[] kthSmallestPrimeFraction(int[] arr, int k) {
Queue<int[]> queue = new PriorityQueue<int[]>((a, b) -> arr[a[0]] * arr[b[1]] - arr[a[1]] * arr[b[0]]);
for (int idx = 1; idx < arr.length; idx++) {
queue.add(new int[] { 0, idx });
}
while (--k > 0) {
int[] fraction = queue.poll();
if (fraction[0]++ < fraction[1]) {
queue.add(fraction);
}
}
int[] result = queue.poll();
return new int[] { arr[result[0]], arr[result[1]] };
}
}
결과
설명
- arr은 아래의 규칙으로 이루어진 분수 표현법을 적용할 경우 k번째 작은 값을 찾는 문제이다.
- 배열 arr의 첫 값은 ‘1’이며, 양의 정수로 이루어져있다.
- 배열 arr의 값은 [i, …, j]로 이루어져 있으며, $0 <= i < j < arr.length$를 만족한다.
- arr은 $frac{i}{j}$의 분수로 표현 가능하며, 결과 값인 answer은 [arr[i], arr[j]] 형태의 정수 배열로 반환한다.
- queue는 작은 분수 값이 가장 앞에 위치하도록 각 값의 위치 정보를 저장할 변수로, 아래의 정렬을 기반으로 한 PriorityQueue로 초기화한다.
- queue 내 정수 배열 a와 b를 arr을 이용해 더 작은 값이 맨 앞으로 위치하도록 아래의 두 값의 차이가 큰 수가 앞으로 나오게 정렬하게 한다.
- arr에서 a의 분자에 해당하는 a의 첫 번째 값과 b의 분모에 해당하는 b의 두 번째 값의 곱.
- arr에서 a의 분모에 해당하는 a의 두 번째 값과 b의 분자에 해당하는 b의 첫 번째 값의 곱.
- queue 내 정수 배열 a와 b를 arr을 이용해 더 작은 값이 맨 앞으로 위치하도록 아래의 두 값의 차이가 큰 수가 앞으로 나오게 정렬하게 한다.
-
queue에 1부터 arr의 길이 미만까지 반복하여, [1, idx] 형태로 arr의 위치 값을 배열로 넣어준다.
- k를 감소시키고 0보다 클 때 까지 아래를 수행한다.
- fraction을 queue에서 가장 작은 값을 꺼내 넣어준다.
- faction의 첫 번째 값을 증가시켰을 경우, 두 번째 값보다 작으면 1 미만의 값이므로 queue에 다시 faction을 넣어준다.
- 반복이 완료되면 result에 k번째 작은 분수의 값을 표현할 값을 queue에서 꺼내 넣어주고, 주어진 문제의 결과로 arr에서 result의 첫 번째 값과 result의 두 번째 값을 배열로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기