1 minute read

문제 유형 : 정렬, 최대값, 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회 이하입니다.


-test case

citations return
[3, 0, 6, 1, 5] 3

해결방법

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

라는 h-index의 설명을 이용해 해결하였다.

  1. 먼저 주어진 벡터를 내림차순으로 정렬하고, 벡터의 최대값을 찾는다.
  2. h의 최대값은 벡터의 최대값과 같으므로 amx부터 0까지 하나씩 돌아가면서 조건에 맞는지 확인하고, 조건에 맞으면 리턴한다.
  3. countFunc 함수를 이용해 h번 이상 인용도니 논문이 몇편인지 구하고
  4. (i <= more_than && (n - more_than) <= i) 조건이 참이면 h-index이므로 리턴한다.

참고

  • 내림차순 정렬 : sort함수 사용
    • algorithm 헤더파일에 포함
    • 세번째 인자로 비교함수를 두면 원하는 대로 정렬할수있다.
  • 최대값 찾기 : *max_element 사용
    • 이 문제에서는 이미 내림차순으로 정렬을 마쳤기 때문에 정렬된 벡터의 첫번째 인자가 최대값이라는것을 알수있다.
      따라서 굳이 이 방법을 사용하지 않아도 된다.

solution

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
bool cmp(int a, int b) {
    return a > b;   //내림차순 정렬
}
int countFunc(vector<int> v, int h) {
    int count = 0;
    for (int i = 0; i < v.size(); i++) {
        if (h > v[i]) {
            return count;
        }
        count++;
    }
}
int solution(vector<int> citations) {
    int answer = 0;

    sort(citations.begin(), citations.end(), cmp);              //내림차순 정렬
    int max = *max_element(citations.begin(), citations.end()); //벡터 최대값
    int n = citations.size();
    for (int i = max; i >= 0; i--) {
        //어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고
        //나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
        int more_than = countFunc(citations, i);
        if (i <= more_than && (n - more_than) <= i) {
            answer = i;
            break;
        }
    }


    return answer;
}


image

image