프로그래머스/Lv. 2

[프로그래머스 코딩테스트] H-Index(Java)

Sigfriede 2023. 7. 2. 01:00

  문제 설명

  H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과에 따르면, 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
import java.util.Arrays;
class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);
        int h = 0;
        int hIndex = 0;
        for (int i = 0; i < citations.length; i++) {
            h = citations[i];
            hIndex = citations.length - i;
            if (h >= hIndex) {
                answer = hIndex;
                break;
            }
        }
        return answer;
    }
}

  Arrays 클래스의 sort 메소드를 이용하여 배열 citations를 오름차순으로 정렬합니다.

  변수 h와 hIndex를 생성합니다. h는 각 논문의 인용 횟수, hIndex는 hIndex를 구하기 위해 점차 증가할 값입니다.

  for문이 citations의 길이만큼 순회합니다.

  h에 citations의 i번째 원소를 할당합니다.

  hIndex에 citations의 길이에 i를 뺀 값을 할당합니다.

  if문에서 h가 hIndex보다 크거나 같다면 answer에 hIndex를 할당합니다.

  break를 이용하여 반복문을 바로 탈출합니다.

 

  반례로는 [1, 4, 5], 2와 [5, 6, 7], 3이 있습니다. h번 이상 인용된 논문이 h편 이상이어야 하기 때문에 hIndex가 항상 배열의 원소에 있는 값임을 보장할 수 없습니다.

  입출력 예 1번에서 h와 hIndex 값을 살펴보면,

h: 0
hIndex: 5

h: 1
hIndex: 4

h: 3
hIndex: 3

  이와 같은 순서로 값이 갱신됩니다.

  문제의 설명이 다소 애매모호하고, 입출력 예 역시 혼란의 여지가 있으므로 더 헷갈리는 문제였던 것 같습니다.