[프로그래머스 Level 2] H-Index

🖊️ 문제

H-Index 

 

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회 이하입니다.

 

🖥️ 코드

#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> citations) 
{
    sort(citations.begin(), citations.end(), greater<int>());
    
    for(int idx = 0; idx < citations.size(); idx++)
        if(idx + 1 > citations[idx]) 
            return idx;
        
    return citations.size();
}

 

🤔 나의 생각

H번 이상 인용된 논문이 H편 이상인데 그 H의 최댓값을 구하는 문제다!이다. 근데... 처음 읽으면 되게 헷갈린다.

 

두 가지를 기억하면 헷갈리지 않고 문제를 해결할 수 있다.

  • H의 값은 0 ~ 논문의 수이다.
    • A 교수는 다섯 개의 논문을 발표했는데 아쉽게도 다섯 개 모두 0회 인용되었다. [0, 0, 0, 0, 0]
      0번 이상 인용된 논문이 0편 이상이므로 A 교수의 H-Index는 0이다. 즉, 논문을 발표하기만 하면 기본 H-Index는 0이다. 
    • 반면 논문의 인용 횟수가 [10, 10, 10, 10, 10]라면 H-Index는 5이다.
  • H는 citations의 원소가 아니다.
    • B 교수는 네 개의 논문을 발표했는데 각 논문이 [30, 55, 20, 100]회 인용되었다. 
      4번 이상 인용된 논문이 4편 이상이므로 B 교수의 H-Index는 4이다.

 

다시 문제로 돌아와서 인용 횟수를 내림차순을 정렬하고, idx를 0부터 논문의 수만큼 증가시킬 때 idx + 1이 citations[idx]보다 작거나 같다면 우린 두 가지 단계로 정답을 이해할 수 있다.

  • citations[idx]는 idx+1회 이상 인용되었다.
  • idx+1회 이상 인용된 논문이 현재까지 idx+1개 있다. 
    • 문제에서 요구하는 H-Index를 구하는 공식이 바로 여기 있다!

 

생각해 보니 위 설명과 비슷한 코드는 아래와 더 가깝다.

#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> citations) 
{
    int answer = 0; 
    
    sort(citations.begin(), citations.end(), greater<int>());
    
    for(int idx = 0; idx < citations.size(); idx++)
        if(idx+1 <= citations[idx]) answer = idx+1;
        else break;
    
    return answer;
}