본문 바로가기
Algorithm/Python

[프로그래머스] H-Index

by _sweep 2022. 2. 3.

문제 링크 >> https://programmers.co.kr/learn/courses/30/lessons/42747

 

 

📋 문제

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

위키백과에 따르면, H-Index는 다음과 같이 구합니다.

 

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

 

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

 

 

👉 출력

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

 

 

 

📝 풀이

❌ 첫 번째 풀이

def solution(citations):
    count = {}
    for i in sorted(citations)[:int(len(citations)/2)+1]:
      count[i]=list(filter(lambda x: x>=i, citations))
    result = [k for k, v in count.items() if k <= len(v)]
    answer = max(result)
    return answer

 

입력으로 주어진 citations 배열을 오름차순으로 정렬한 뒤 절반만을 순회하며 해당 원소보다 같거나 큰 값만을 count에 저장했다.

그러면 count에는 인용된 횟수가 key로, 해당 횟수보다 같거나 큰 횟수가 value로 저장된다.

그리고 다시 count 딕셔너리를 순회하면서 key보다 인용된 횟수가 더 많은 것만 골라 result에 담고 result에서 최대값을 출력하도록 했다.

 

결과는 테스트케이스 2개 빼고 모조리 전멸!

 

✔️ 두 번째 풀이

def solution(citations):
    citations.sort(reverse=True)
    answer = [0]
    
    for i in range(1,len(citations)+1):
        if citations[i-1] >= i:
            answer.append(i)
    
    return max(answer)

 

H-index를 구한다는 게 어떻게 구해지는 건지 이해가 가지 않아서 H-index의 개념을 먼저 살펴봤다.

그러다 쉽게 이해할 수 있는 글을 찾았는데 그에 따르면 H-index는 다음과 같다.

 

H-지수 구하는 방법

나의 h는 어떻게 구할 수 있을까? 우측의 표와 같이 자신이 저널에 등재한 전체 논문중 많이 인용된 순으로 정렬한 후, 피인용수가 논문수와 같아지거나 피인용수가 논문수보다 작아지기 시작하는 숫자가 바로 나의 h가 됩니다. 이 표에서는 10이 H-지수가 되는 것입니다. 다시 말하여, 이 연구원은 논문 인용횟수가 10이 넘는 논문이 적어도 10편이 된다는 것을 의미합니다.

 

즉, H-index를 구하는 방식은 논문이 많이 인용된 순으로 정렬한 후 피인용수가 논문 수와 같아지거나 피 인용수가 논문 수보다 작아지기 시작하는 수를 구하는 것이다.

 

따라서 입력으로 주어진 citations를 내림차순으로 정렬한 뒤 논문 수와 피인용수를 비교하며 피인용수가 논문 수보다 크거나 같은 값을 answer 배열에 담아준다.

그리고 answer의 요소 중 최댓값을 리턴하면 된다.

 

 

🔍 

 H-지수(H-Index) 란 무엇인가? https://www.ibric.org/myboard/read.php?Board=news&id=270333

 

 

 

 

 

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

[백준2805번] 나무 자르기  (0) 2022.02.03
[백준4673번] 셀프 넘버  (0) 2022.02.03
[프로그래머스] 가장 큰 수  (0) 2022.02.02
[프로그래머스] K번째 수  (0) 2022.02.02
[LeetCode] Longest Word in Dictionary  (0) 2022.01.31

댓글