[프로그래머스] H-Index(python)
본문 바로가기
Algorithm/Python, C++

[프로그래머스] H-Index(python)

by liveloper jay 2022. 9. 30.

문제

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 

 

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

 

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

 

 

제한조건

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

 

 입출력 예

 

 

 

 

 

풀이

 이 문제는 H-Index를 먼저 이해해야 풀이가 가능한 문제입니다. 먼저 H-Index의 정의는 다음과 같습니다.

💡 H-Index란?

h - index  처음에 개별 과학 자나 학자 에게 사용된 출판물의 생산성  인용 영향  모두 측정 하는 저자 수준 측정항목 입니다.

h -index는 주어진 저자/저널이 각각 최소 h 회 인용된 최소 h 개의 논문을 출판 한 h 의 최대값으로 정의됩니다 . 이 지수는 총인용수나 출판물 수와 같은 단순한 척도를 개선하기 위해 고안되었다. 동일한 분야에서 일하는 학자들을 비교할 때 색인이 가장 잘 작동합니다. 인용 규칙이 분야마다 크게 다르기 때문입니다

 

 

 이러한 H-Index는 어떻게 계산할 수 있을까요? 이 문제의 예시를 이용하여 계산하는 방법을 알아보겠습니다.

먼저 [3, 0, 6, 1, 5] 이라는 리스트가 있고, H-Index 계산을 하기 위해서 먼저 내림차순으로 정렬을 해주어야 합니다. 내림차순으로 정렬하면 [6, 5, 3, 1, 0] 의 순서가 됩니다. 여기서 리스트n 번째 값이 최초로 n을 넘지 않을 때, n-1의 값이 H-Index 값이 됩니다. 이것을 표로 나타내면 아래와 같습니다.

순번 N번째 리스트 값 기준 값
1 6 6 > 1  (X)
2 5 5 > 2  (X)
3 3 3 = 3  (X)
4 1 1 < 4  (O)
5 0  

 

 여기서 3번째 까지 리스트의 값이 순번보다 크거나 같지만, 4번째의 경우 리스트의 값이 순번보다 작기 때문에, 기준 값은 조건에 부합하는 마지막 순번이었던 3이 됩니다.

 

 이제 이를 활용하여 리스트의 각 값이 기준 값보다 크거나 같은지를 판별하면 됩니다. 위의 표에서는 [6, 5, 3] 이 기준 값인 3보다 크거나 같으므로 H-Index의 값은 3이 됩니다.

여기서 H-Index를 구해도 무방하지만, 다시 생각해보면 리스트의 값이 내림차순으로 정렬이 되어있기 때문에 기준이 되는 순번에 -1을 해주면 H-Index 값이 되는 것을 알 수 있습니다. 이렇게 되면 소스코드로 구현시 H-Index로 구현하기 위해 반복문을 한번 더 사용하지 않아도 되기 때문에 훨씬 효율적으로 코드를 작성할 수 있습니다. 

 

위 풀이를 기준으로 작성한 소스코드는 다음과 같습니다.

def solution(citations):
    answer = 0
    citations.sort(reverse=True)    # 내림차순으로 정렬
    
    for i in range(len(citations)):
        if(citations[i] < i+1):     # H-Index 값을 구하기위해 비교
            answer = i              # 찾으면 i 값(n-1)이 H-Index 값
            break
   
    return answer

??? 왜지.....

 

문제없이 잘 통과할 줄 알았으나..... 테스트 9번만 통과하지 못했습니다. (반례를 찾아야 되네요....ㅠㅠ)

 

 이럴 경우 제가 보통 많이 생각하는 것이 리스트의 값이 모두 같은 값일 때의 경우입니다. 이를 생각하여 [5,5,5,5] 이라는 리스트가 있다고 가정하고 H-Index를 구해보겠습니다. 

순번 N번째 리스트 값 기준 값
1 5 5 > 1 (X)
2 5 5 > 2 (X)
3 5 5 > 3 (X)
4 5 5 > 4 (X)

 

이렇게 되면 리스트의 길이가 4이고, 모든 리스트의 인용 값이 5이기 때문에 H-Index의 값은 4가 되어야 합니다. 하지만 위의 소스코드를 기준으로 테스트를 해보면 H-Index의 값은 0이 됩니다. 아마도 테스트 9번이 통과하지 못한 것이 이 때문이지 않을까 생각하고, 수정한 소스코드는 다음과 같습니다.

 

def solution(citations):
    answer = 0
    citations.sort(reverse=True)
    
    for i in range(len(citations)):              # H_index가 존재하고 H_index를 넘는 논문이 몇 개인지 구할때
        if(citations[i] < i+1):
            return i

    return len(citations)                     # 인용 횟수가 모두 같을때는 전체를 return

 

 

이와 같이 코드를 작성하면 모든 테스트 케이스를 통과하는 것을 확인할 수 있습니다.

 

 

 

댓글