h-index & g-index

연구자의 연구업적을 평가할 때 사용되는 지표 중 h-index와 g-index라는 것이 있다.

  • h-index : 인용 횟수가 h번 이상인 논문이 h개일 때 가능한 h의 최댓값
  • g-index : 인용 횟수가 높은 상위 g개 논문의 인용 횟수 총합이 g²이상일 때 가능한 g의 최댓값

어떤 학자가 쓴 논문 각각의 인용 횟수가 주어질 때, h-index와 g-index를 계산하시오.

e.g.)

  • 입력 : 0 15 4 0 7 10 0
  • h-index : 4
  • g-index : 6
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

24개의 풀이가 있습니다. 1 / 3 Page

Python 3.5 입니다. g-index 문제 반대로 이해하고 한참을 헤맸네요.

# Function to find h-index
def FindHIndex(cntList):
    cntDict = {}

    for cnt in cntList:
        cntDict[cnt] = 1 + (0 if cntDict.get(cnt) is None else cntDict.get(cnt))

    beforeCnt = 0

    for cnt in sorted(cntDict, reverse = True):
        cntDict[cnt] += beforeCnt
        beforeCnt = cntDict[cnt]

        if cntDict[cnt] >= cnt:
            return cnt

# Function to find g-index
def FindGIndex(cntList):
    sumList = sorted(cntList, reverse = True)

    beforeSum = 0

    for i in range(len(sumList)):
        sumList[i] += beforeSum
        beforeSum = sumList[i]

        if i * i >= sumList[i]:
            return i

# Main
# Input string
input = '0 15 4 0 7 10 0'

# Input list from input string
quoteCnt = [int(x) for x in input.split(' ')]

# Find h-index
hIndex = FindHIndex(quoteCnt)
print('h-index: '+str(hIndex))

# Find g-index
gIndex = FindGIndex(quoteCnt)
print('g-index: '+str(gIndex))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
paperquote = [ 0, 15, 4, 0 , 7, 10, 0 ]

paperquote.sort(reverse=True)

for i in range( max( paperquote ) ) :
    cnt = 0
    for j in paperquote :
        if j >= i : cnt += 1
    if cnt < i : print "h-index : %d"%(i-1) ; break

for i in range(1, len( paperquote ) + 1 ) :
    cnt = 0
    sum = 0
    for j in paperquote :
        cnt += 1
        sum += j
        if cnt == i : break 
    if ( sum < i * i ) : print "g-index : {0}".format(i-1) ; break

아 이 방식으로는 g-index가 전체 논문 인용횟수와 같을 때 출력이 안 되네요.... - Kim JungRae, 2015/11/03 09:18 M D
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
#include <iostream>
#include <map>
#include <functional>
#include <cmath>

using namespace std;

int main(int argc, const char * argv[]) {

    int n;
    cin >> n; // 논문 데이터의 개수

    map<int, int, greater<int>> t_map;
    for (int i = 0; i < n; i++) { // 논문 인용횟수 입력 루프
        int r;
        cin >> r;

        if (t_map.find(r) != t_map.end()) {
            t_map[r]++;
        } else t_map[r] = 1;
    }

    // h-index, g-index 계산부
    int g = 0;
    bool g_found = false;
    int h = 0;
    bool h_found = false;
    int c = 0;
    int r = 0;
    for (auto i : t_map) {
        c += i.second;
        if (!h_found && c >= i.first) {
            h = c;
            h_found = true;
        }
        int r_i = i.first * i.second + r;
        if (!g_found) {
            int c_2 = c * c;
            if (r_i >= c_2) {
                g = c;
                r = r_i;
            } else {
                if (i.first > 0) {
                    g += floor((i.first - 2 * g + sqrt(i.first * (i.first - 4 * g) + 4 * r)) * 0.5); // 2차방정식 근의 공식에 따른 일반해
                } else {
                    g = floor(sqrt(r));
                }
                g_found = true;
            }

        }
        if (g_found && h_found) break;
    }

    cout << "h-index : " << h << endl;
    cout << "g-index : " << g << endl;

    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
def findH(index):
    index.sort(reverse=True)
    for i, j in enumerate(index):
        if (i+1) == j : return index[i]
    return None

def findG(index):
    index.sort(reverse=True)
    sum = 0
    for i, j in enumerate(index):
        sum =  sum + j
        if (i+1)**2 > sum : return i
    return None

index = [0,15,4,0,7,10,0]

print('h-Index : ' + str(findH(index)))
print('g-Index : ' + str(findG(index)))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

c++로 작성하였습니다.

#include <iostream>
using namespace std;

int main()
{
    int h_index = 0, g_index = 0;
    int index[7] = { 0, 15, 4, 0, 7, 10, 0 };
    int temp = 0;
    for (int i = 0; i < sizeof(index) / sizeof(int); i++) {
        if (i + 1 <= index[i])
            h_index++;

        temp += index[i];
        if (temp >= (i + 1) * (i + 1))
            g_index++;

    }
    cout << "h_index : " << h_index << endl;
    cout << "g_index : " << g_index << endl;

    return 0;
}
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
Cite_Index = [0, 15, 4, 0, 7, 10, 0]
Cite_Index.sort(reverse=True)

h_index = 1

while True:
    for x in range(len(Cite_Index)):
        if Cite_Index[x] < h_index:
            break
    if x > h_index:
        h_index += 1
    elif x == h_index:
        break
    else:
        print('There is no h_index')
        h_index = 0
        break

for x in range(1,len(Cite_Index)+1):
    if sum(Cite_Index[:x]) < x ** 2:
        g_index = x-1
        break

print('h_index:  %d\ng_index:  %d' % (h_index,g_index))

인용횟수가 모두 0인 경우도 고려하였습니다.

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.
L = [0,15,4,0,7,10,0]
def h_index(L):
    index = 0
    while True:
        if len(filter(lambda x : x>=index, L))>=index: index +=1
        else : return index-1
def g_index(L):
    index = 0
    while True:
        if sum(sorted(L,reverse=True)[0:index])>=index*index : index +=1
        else : return index-1

print h_index(L)
print g_index(L)

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬3.4입니다.

idx = [0, 15, 4, 0, 7, 10 ,0]

cnt = 0
h_index = []
for h in range(1, len(idx) + 1):
    for i in idx: 
            if i >= h: cnt += 1
    if h == cnt: h_index.append(h)
    cnt = 0
print('h-index: {}'.format(max(h_index)))

g_index = []
idx.sort(reverse = True)
for g in range(1, len(idx) + 1):
    if sum(idx[:g]) >= g ** 2: g_index.append(g)
print('g-index: {}'.format(max(g_index)))   

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

파이썬입니다.

def h(xs):
    return max([x for x in xs if len([y for y in xs if y >= x]) == x])

def g(xs):
    return max([g for g in range(1, len(xs)) 
               if sum(sorted(xs, reverse=True)[:g]) >= g**2])

d = [int(x) for x in input().split()]
print("h-index: {}".format(h(d)))
print("g-index: {}".format(g(d)))
※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

constructor에서 입력값은 받고 있습니다.


    // 0 , 15, 4, 0, 7, 10, 0
    int indexOfQuote[];
    public HIndexGIndex(){

    }

    public HIndexGIndex(int[] index){
        this.indexOfQuote = index;
    }
    public int getGIndex(){
        int total = 0 , g = 0 ;

        // 1. check count of quote
        for(int i = 0 ;i < indexOfQuote.length ;i++){
            if(indexOfQuote[i] !=0) {
                total += indexOfQuote[i];
            }
        }

        g = (int) Math.sqrt((double)total);

        return g;

    }

    public int getHIndex(){
        int count= 0, h_index= 0;
        // 1. check count of quote
        for(int i = 0 ;i < indexOfQuote.length ;i++){
            if(indexOfQuote[i] !=0) {
                count++;
            }
        }
        // 2. check count of the over than h numbers.
        for(int j = 0 ; j < indexOfQuote.length ;j++){
            if( indexOfQuote[j] >= count){
                h_index++;
            }
        }

        return h_index;

    }

2016/04/12 22:48

xeo

※ 상대에게 상처를 주기보다 서로에게 도움이 될 수 있는 댓글을 달아 주세요.

풀이 작성

※ 풀이작성 안내
  • 본문에 코드를 삽입할 경우 에디터 우측 상단의 "코드삽입" 버튼을 이용 해 주세요.
  • 마크다운 문법으로 본문을 작성 해 주세요.
  • 풀이를 읽는 사람들을 위하여 풀이에 대한 설명도 부탁드려요. (아이디어나 사용한 알고리즘 또는 참고한 자료등)
  • 작성한 풀이는 다른 사람(빨간띠 이상)에 의해서 내용이 개선될 수 있습니다.
목록으로
코딩도장

코딩도장은 프로그래밍 문제풀이를 통해서 코딩 실력을 수련(Practice)하는 곳입니다.


언어별 풀이 현황
전 체 x 24
python x 16
cpp x 2
java x 2
cs x 1
ruby x 1
기 타 x 1
matlab x 1