[Java/자바] 프로그래머스 Lv2 - H-Index

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다.

위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

 

제한사항
  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

 

입출력 예
citations return
[3, 0, 6, 1, 5] 3

Solution.java

이 문제는 이해하기가 어려워서 그렇지 문제를 이해한다면 코드를 짜기에는 난이도가 높지는 않습니다.

h인덱스가 뭔지에 대해 문제를 아무리 봐도 이해가 힘들 수 있는데요

문제에서 제공해준 위키백과에 설명한 내용을 바탕을 쉽게 풀이해서 설명하면 다음과 같습니다.

 

* 배열의 값이 [3, 0, 6, 1, 5] 이라고 가정하고 설명하겠습니다.

먼저, 인용의 수가 많은 순서대로 내림차순하여 정렬합니다.

그 다음 논문 수가 논문 인용 수보다 더 작아지기 시작하는 전의 값이 h-index가 됩니다.

이 내용을 바탕으로 코드를 한줄 씩 봅시다.

import java.util.Arrays;

public class H_index {
    public static void main(String[] args) {
        System.out.println(solution(new int[] {3, 0, 6, 1, 5}));
    }

    public static int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);

        for (int i = 0; i < citations.length; i++) {
            int discussionCount = citations.length - i;

            if (citations[i] >= discussionCount) {
                answer = discussionCount;
                break;
            }
        }
        return answer;
    }
}

 

문제 풀이

위 설명에서는 내림차순 정렬하여 한다했지만, H-index는 보통 맨 뒤쪽에 있으므로 오름차순하여 찾는다면 더 빨리 찾을 수 있습니다.

  1. citations를 오름차순 정렬한다.
  2. 맨 앞의 논문 인용 수(citations)부터 반복문을 시작하여 논문의 개수(discussionCount)를 하나씩 줄여갑니다.
  3. 위 설명에서는 내림차순을 하여 설명했지만 여기서는 오름차순을 했기 때문에, 반대로 논문 인용 수가 논문의 개수보다 크거나 같아지면 그 수가 H-index가 됩니다.
  논문 인용 수 비교 논문 수
index citations[i]
= 0
citations[i]
= 1
citations[i]
= 2
citations[i]
= 3
citations[i]
= 4
 
0 0 1 3 5 6 < 5
1 0 1 3 5 6 < 4
2 0 1 3 5 6 = 3
3 0 1 3 5 6 > 2
4 0 1 3 5 6 > 1