https://leetcode.com/problems/h-index
int [] citations = citations [i]는 인용된 횟수 가 주어졌을 때 H-index를 리턴하라.
우선 H-index가 무엇인지 용어부터 명확히 해야 한다.
H-index란 발표한 논문 n편 중, h번 이상 인용된 논문이 H 편 이상이고 나머지 논문이 H번 이하 인용되었을 때 H의 최댓값을 말한다.
정렬
예제를 보자.
int[ ] citations = [3, 0, 6, 1, 5]
이때 이 연구원은 5편의 논문을 발표했다는 것이다. 그리고 각각의 논문의 인용 횟수를 나타내고 있다.
이 정보를 토대로 이 연구원은 3편의 논문이 3회 이상 인용됐고 나머지 2편이 3회 이하로 인용됐다. 따라서 이 사람의 H-index는 3이 된다.
우선은 이상, 이하의 개수를 세야 하는 것이기 때문에 정렬을 하면 더 효율적이게 될 것이다.
[0, 1, 3, 5, 6]
여기서 idx를 이동시키며 확인을 하면 될 것이다. 이때 idx를 기준으로 개수가 정해지고 그 개수 범위 내의 인용 횟수를 확인하면 될 것이다.
class Solution {
public int hIndex(int[] citations) {
Arrays.sort(citations);
int n = citations.length;
for (int h = n; h > 0; h--) {
if (citations[n - h] >= h) {
return h;
}
}
return 0;
}
}
최종적으로는 O(nlogn)의 시간복잡도로 문제 풀이가 가능하다.
계수 정렬
이 문제는 인용 값의 범위가 0이상 1000 이하이다.
따라서 계수정렬을 쓰면 그다지 큰 공간을 사용하지 않으면서도 O(N+M)의 빠른 속도로 문제를 풀 수 있다.
class Solution {
public int hIndex(int[] citations) {
int n = citations.length;
int[] count = new int[n + 1];
for (int c : citations) {
if (c >= n) {
count[n]++;
} else {
count[c]++;
}
}
int total = 0;
for (int i = n; i >= 0; i--) {
total += count[i];
if (total >= i) {
return i;
}
}
return 0;
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 238 - Product of Array Except Self (0) | 2024.09.29 |
---|---|
LeetCode 380 - Insert Delete GetRandom O(1) (0) | 2024.09.29 |
LeetCode 45 - Jump Game2 (0) | 2024.09.29 |
LeetCode 55 - Jump Game (1) | 2024.09.29 |
LeetCode 122 - Best Time to Buy and Sell Stock 2 (3) | 2024.09.28 |