[LeetCode] H-Index - 연구 논문의 영향력 측정 (탐욕법 + 정렬)
문제 설명
LeetCode의 "H-Index" 문제는 연구자가 발표한 논문들의 인용 횟수를 분석하여 H-Index를 계산하는 문제입니다.
- 연구자가 발표한 논문의 인용 횟수가 배열 citations로 주어집니다.
- 연구자의 H-Index는 h 편의 논문이 최소 h번 이상 인용되었으며, 나머지 논문은 h번 이하로 인용된 경우의 최대값입니다.
- 항상 H-Index를 계산할 수 있다고 가정합니다.
📌 문제를 풀면서 생각한 과정
처음에는 각 논문의 인용 횟수를 순차적으로 확인하며 H-Index를 계산하는 방법을 떠올렸습니다.
하지만 효율적인 탐색이 필요하여 탐욕법(Greedy Algorithm)과 정렬을 활용한 최적화 방법을 도출했습니다.
📌 H-Index 계산 방법
✅ 핵심 아이디어
- 논문을 인용 횟수 기준으로 내림차순 정렬합니다.
- 각 논문이 i+1번째로 많이 인용된 논문인지 확인합니다.
- citations[i] >= i + 1 → H-Index 가능
- 더 이상 만족하지 않으면 마지막으로 i가 유효한 값이 됨
📌 탐욕법(Greedy) 코드
export function hIndex(citations: number[]): number {
citations.sort((a, b) => b - a); // 내림차순 정렬
let h = 0;
for (let i = 0; i < citations.length; i++) {
if (citations[i] >= i + 1) {
h = i + 1;
} else {
break;
}
}
return h;
}
📌 실행 예제 분석
console.log(hIndex([3, 0, 6, 1, 5])); // Output: 3
console.log(hIndex([1, 3, 1])); // Output: 1
console.log(hIndex([10, 8, 5, 4, 3])); // Output: 4
console.log(hIndex([0, 0, 0, 0])); // Output: 0
console.log(hIndex([100])); // Output: 1
✅ 논문을 내림차순으로 정렬하여 탐색을 최적화 ✅ 각 논문이 i+1번째 이상 인용되었는지 확인 ✅ H-Index가 더 이상 증가하지 않으면 중단
📌 시간 및 공간 복잡도 비교
방법 시간 복잡도 공간 복잡도 특징
정렬 후 탐욕법(Greedy) | O(N log N) | O(1) | 최적의 방법, 빠름 |
✅ 탐욕법(Greedy)과 정렬을 활용하여 최적의 해결법을 적용 🚀
📌 Jest 테스트 코드
describe("Medium 274: H-Index", () => {
it("returns the correct H-Index for a standard case", () => {
expect(hIndex([3, 0, 6, 1, 5])).toEqual(3);
});
it("returns the correct H-Index when values are small", () => {
expect(hIndex([1, 3, 1])).toEqual(1);
});
it("returns the correct H-Index when all values are high", () => {
expect(hIndex([10, 8, 5, 4, 3])).toEqual(4);
});
it("returns 0 when all citations are 0", () => {
expect(hIndex([0, 0, 0, 0])).toEqual(0);
});
it("returns 1 when there is only one highly cited paper", () => {
expect(hIndex([100])).toEqual(1);
});
});
✅ 다양한 입력 케이스 검증하여 정확성 확보
✅ 테스트 케이스 추가 (단일 요소, 정렬된 점프, 초기 정지 상황)
📌 최종 정리
- 탐욕법(Greedy)과 정렬을 활용하여 O(N log N) 최적화 적용
- "현재 논문의 인용 횟수가 i+1개 이상인지"를 확인하여 H-Index를 계산
- 추가 배열 없이 O(1) 공간복잡도로 해결 가능
💡 이제 비슷한 문제를 만나면 "탐욕법 + 정렬"을 우선 고려해 보세요! 🚀
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode 45] Jump Game II - 최소 점프 횟수 찾기 (탐욕법 + DP) (0) | 2025.03.09 |
---|---|
[LeetCode 55] Jump Game - 탐욕법(Greedy) 풀이 및 최적화 (0) | 2025.03.08 |
[LeetCode 122] Best Time to Buy and Sell Stock II - Greedy & DP 풀이 (0) | 2025.03.07 |
[LeetCode 169] Majority Element - 보이어-무어 투표 알고리즘 (Boyer-Moore Voting Algorithm) 풀이 (0) | 2025.03.06 |
[LeetCode 189] Rotate Array - TypeScript 문제 풀이 및 최적화 (0) | 2025.03.05 |