Sort - H-Index (Lv.2)

2022. 2. 18. 17:462022/Programmers

문제 설명

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

입출력 예

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

입출력 예 설명

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

 

<My Source Code 1>

def solution(citations):
    answer = 0
    citations = sorted(citations, reverse = True)
    for i in citations:
        hCount = list(map(lambda x : x>=i, citations)).count(True)
        if hCount>=h:
            return h
    return len(citations)

한번에 성공할리 없는 내 코드~

하지만 여기서 내가 무엇을 놓치고 코드를 짰는지 찾아가는 과정도 꽤 쏠쏠하게 재밌다 ㅎㅎ

 

어쨌든 아무리 보아도 문제 길이도 짧고, 놓친 조건도 없는데 풀리지가 않아서 H-Index에 대해 정의를 먼저 알아보기로 했다.

 

H-Index
본인이 저널에 등재한 전체 논문 중에서 많이 인용된 순으로 정렬한 후, 피인용수가 논문수와 같아지거나 논문수가 피인용수보다 커지기 시작하는 숫자가 바로 'h'가 되는 것이다.

 

기존의 나의 코드가 문제가 됐던 부분은 "resultList = list(map(lambda x : x>=i, citations))" 이부분이다.

예를 들어  [9, 3, 4, 5, 10, 8, 2, 3, 7, 8, 14, 5, 5, 4, 3]이 라고 하면,  정렬 결과는 [14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2]가 된다.

나의 코드대로 라면,

citiations hCount (h번 이상 인용된 논문의 개수) h (인용 횟수)
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 1 14
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 2 10
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 3 9
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 5 8
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 5 8
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 6 7
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 9 5

"인용 횟수가 동일한 경우"가 발생하는 경우에는 "피인용수가 논문수와 같아지거나 논문수가 피인용수보다 커지기 시작하는 시점(숫자)"를 찾기 힘들어진다. 즉 피인용수를 구한게 아니라 특정 횟수 이상 인용된 논문의 개수를 구한것이므로  문제풀이 자체가 잘못된것이다.

 

따라서, 

citiations hCount (논문의 개수) h (인용 횟수)
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 1 14
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 2 10
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 3 9
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 4 8
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 5 8
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 6 7
[14, 10, 9, 8, 8, 7, 5, 5, 5, 4, 4, 3, 3, 3, 2] 7 5

이렇게 되어야지만이 정확한 피인용수가 눈문의 수와 같아지거나 작아지는 수를 찾을 수 있게 된다.

 

이렇게 제대로 이해를 한 후의 나의 풀이는 아래와 같다.

 

<My Source Code 2>

def solution(citations):
    citations = sorted(citations, reverse = True)
    for idx, quotNum in enumerate(citations):
        if idx+1 >=quotNum:
            return idx 
    return len(citations)

즉, quotNum번 이상 인용된 논문이 quotNum개 이상인 것을 찾아야하는데 

quotNum개 이상 인용된 논문의 개수는 내림차순 정렬에 의해 idx+1(idx는 0부터 시작하므로 개수를 구하기 위해서는 +1)개가 된다. 

 

즉, idx+1 >= quotNum 이 된다

 

'2022 > Programmers' 카테고리의 다른 글

Stack/Queue - 기능개발 (Lv.2)  (0) 2022.02.21
Heap - 디스크 컨트롤러** (Lv.3)  (0) 2022.02.20
Sort - K번째 수 (Lv.1)  (0) 2022.02.17
Sort - 가장 큰 수** (Lv.2)  (0) 2022.02.16
Stack/Queue - 프린터(Lv.2)  (0) 2022.02.15