본문 바로가기
Algorithm/프로그래머스

[Algorithm / Programmers] H-Index

by newtownboy 2024. 4. 26.


[Version]
⦁ 2024.04.26 / [Algorithm / Programmers] H-Index

 

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        // 배열을 오름차순으로 정렬합니다.
        Arrays.sort(citations);
        
        // h-index 값을 저장할 변수를 초기화합니다.
        int hIndex = Integer.MIN_VALUE;
        
        // 각 논문에 대해 반복하면서 h-index를 계산합니다.
        for(int i = 0; i < citations.length; i++) {
            // 현재 논문의 인용 횟수와 나머지 논문의 수 중 작은 값을 구합니다.
            int minCitations = Math.min(citations[i], citations.length - i);
            // 현재 계산된 h-index 값과 minCitations 값 중 큰 값을 hIndex에 저장합니다.
            hIndex = Math.max(hIndex, minCitations);
        }
        
        // 최종적으로 계산된 h-index 값을 출력합니다.
        System.out.println(hIndex);
        
        // 계산된 h-index 값을 반환합니다.
        return hIndex;
    }
}

문제를 처음 접했을 때, H-Index의 정의를 이해하는데 시간이 걸렸다. H-Index의 정의는 어떤 과학자가 발표한 논문 N편 중 H번 이상 인용된 논문이 H편 이상이고 나머지 논문이 H번 이하 인용되었다면 H의 최댓값이 과학자의 H-Index라고 한다.

 

즉, H-Index는 선언된 배열 내에서 H번 이상 인용된 논문이 H편 이상일 경우 H의 값을 칭하는 것이다. 따라서 나는 배열을 오름차순으로 정렬한 후 현재 선택된 원소가 남은 원소의 개수보다 작거나 같을 경우 H-Index의 값을 갱신했고 그 결과는 아래 코드와 같다.

 

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        Arrays.sort(citations);
        
        int hIndex = Integer.MIN_VALUE;
        for(int i = 0; i < citations.length; i++) {
            if(citations[i] <= citations.length - i) {
                hIndex = citations[i];
            }                
        }
        
        return hIndex;
    }
}

 

문제의 예시에서는 중복된 경우가 없었기 때문에 테스트케이스는 통과했지만 문제를 제출하니 틀렸다는 결과가 나왔다. 때문에 중복된 경우의 수를 생각하여 소스코드를 수정했다. 현재 논문의 인용횟수와 남은 논문의 개수 중 더 작은 값을 저장한 후 H-Index보다 값이 클 경우 갱신하는 방식으로 문제를 해결할 수 있었다.