단의 개발 블로그

H-Index 본문

Algorithm/PYTHON

H-Index

danso 2024. 9. 13. 14:57

💡 문제

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

입출력 예

 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3 이하 인용되었기 때문에  과학자의 H-Index 3입니다.

 풀이

def solution(citations):
    answer = 1
    citations = sorted(citations)
    size = len(citations)
    for i in range(size):
        if (i+1) > citations[size-1-i]:
            return i
        
    return size

H Index에 대해서 설명이 이해가 되지 않았다. H Index는 출판물의 생산성과 인용 영향을 측정하는 지표다. 해당 지수는 논문이 각각 n번 이상 인용되고, n번 이상 인용되지 않음을 뜻한다고 한다. 예를들어 지수가 5라면 5편의 논문이 최소 5번 이상 인용되고, 인용 되지 않음을 뜻한다. 이걸 표로 나타내면 아래와 같다.

논문 인용 횟수
논문 1 10회 인용
논문 2 8회 인용
논문 3 5회 인용
논문 4 4회 인용
논문 5 2회 인용

이 경우 5편의 논문이 각각 5회 이상 인용되고, 인용되지 않았으므로 지수가 5가 된다.

 

+ 정답 코드 중 간단한 코드가 있어 해당 코드를 분석했다.

def solution(citations):
    citations.sort(reverse=True)
    answer = max(map(min, enumerate(citations, start=1)))
    return answer
  1. enumerate(citations, start=1): enurmerate를 사용하여 각 논문의 인용 수에 대해서 인덱스를 생성한다. 이때 인덱스 값을 1부터 시작하도록 설정한다. 해당 값은 다음과 같이 가공된다.[(1, 6), (2, 5), (3, 3), (4, 2), (5, 1)]
  2. map(min, enumerate...): 각 튜플에서 min 함수를 적용한다. 그러면 예제 값이 아래와 같이 변한다.
    1. (1, 6) -> min(1, 6) = 1
    2. (2, 5) -> min(2, 5) = 2
    3. (3, 3) -> min(3, 3) = 3
    4. (4, 1) -> min(4, 1) = 1
    5. (5, 0) -> min(5, 0) = 0
  3. 위에 나온 결과 값이 H-Index의 후보가 된다. 해당 값을 자세히 보면 인덱스는 논문 의 수, 인용수는 논문의 받은 인용 수가 된다. 즉 첫번째 1,6은 논문 1번이 6번 인용 받았으며, 해당 값중 작은 값이 후보 값이 된다. 이걸 반복하여 1,2,3,1,0 의 값을 도출해 낼 수 있다.
  4. max(...) : map으로 얻는 값들 중에서 가장 큰 값을 찾는다. 해당 값이 찾고자 하는 값이다. 

 

'Algorithm > PYTHON' 카테고리의 다른 글

1차 캐시  (2) 2024.09.16
기능개발  (0) 2024.09.16
의상  (0) 2024.09.13
행렬의 곱셈  (0) 2024.09.09
n^2 배열 자르기  (0) 2024.09.09