본문 바로가기

Algorithm

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

문제 요약

이 문제는 요약 할 게 없이 문제 그대로 해석하면 될 것 같습니다.

문제 풀이

위 문제를 읽고 어떤 식으로 풀어야하지 먼저 생각을 해보았지만 너무 헷갈렸습니다. ~이상, ~이하 나머지... 그래서 예시를 하나씩 전부 나열해보았어요. 위 문제에 나온 테스트케이스를 하나씩 쓰면서 생각해보면 아래와 같습니다.

 

[6,3,0,1,5] 

5번 이상 인용된 논문 : 2편 > 5 (x)

4번 이상 인용된 논문 : 2편 > 4 (x)

3번 이상 인용된 논문 : 3편 > 3 (o)

2번 이상 인용된 논문 : 3편 > 2 (o)

1번 이상 인용된 논문 : 4편 > 1 (o)

0번 이상 인용된 논문 : 5편 > 0 (o)

 

위와 같이 쓰게 된다면 바로 규칙이 보여요. H-Index를 기점으로 위는 x, 아래는 o 하지만 이를 안다고해서 코드가 쉽게 써내려지지 않았어요.. 계속 고민해보면서 뭐가 헷갈리는 건지 생각해보았는데.. 결국, 질문하기에 나와있는 질문들을 보면서 무엇이 헷갈렸던건지 알아낼 수 있었습니다. 바로 H-Index는 논문의 개수 중 하나라는 점을 파악하지 못하여 푸는데 한~~참 걸렸습니다.

 

위 예제에서 총 논문의 수는 5개입니다. 그래서 h번 이상, h번 이하로 판단 가능한 h의 범위는 0 <= h <= 5라고 할 수 있어요. H-Index는 논문의 수에서 고르는 것이고, 비교대상은 인용된 논문의 빈번도입니다! 

 

문제를 이해했다면 아래와 같이 알고리즘을 짤 수 있을 것 같습니다. 정렬방식을 이용했는데 배열의 index와 논문의 개수가 동일해서 사용할 수 있었습니다. (너무 당연한 이야기지만)

1. citations 오름차순으로 정렬

2. 논문의 index번호를 하나씩 올리며 논문의 빈번도와 index번호(논문의 개수)를 비교하여 논문의 개수가 크거나 같다면 멈춘다.

 

코드

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

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

 

실제로 논문에는 H-Index표기법을 사용하고 있다고 하네요. 저도 위 풀이법을 H-Index표기법에 대한 자세한 이야기를 읽고 생각해내었습니다. 여기 에서 참고했습니다. 휴💦

 

'Algorithm' 카테고리의 다른 글

[Programmers] 스킬트리  (0) 2021.04.25
[Baekjoon] Contact (feat. 정규표현식)  (0) 2021.04.11
[Programmers] 구명보트  (0) 2021.03.23
[Programmers] K번째수  (0) 2021.03.11
[Programmers] 완주하지 못한 선수  (0) 2021.03.10