CodingTest/정렬 알고리즘

프로그래머스 (Level 2) - H-index

seongduck 2022. 8. 6. 20:09

1. 문제 설명

  • H - index는 과학자의 생산성과 영향력을 나타내는 지표이다.
  • 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 과학자의 H-index이다.
  • 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때 H-index를 return 해라

2. 제한사항

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

3. 입출력 예

citations return
[3,0,6,1,5] 3
  • 이 과학자가 발표한 논문의 수는 5편이다. (3, 0, 6, 1, 5)
  • 그중 3편의 논문은 3회 이상 인용되었다. (3, 6, 5)
  • 나머지 2편의 논문은 3회 이하 인용되었다. (0, 1)
  • 때문에 이 과학자의 H-index는 3이다.

4. 풀이 접근

  1.  배열의 수를 논문 횟수인 n으로 설정한다.
  2.  리스트의 각 요소를 모두 합한 후 n으로 나눈다. (h라 한다.)  <h번 이상 인용된 논문을 찾자 >
  3.  각 리스트 요소를 비교해서 h번 이상 인용된 논문의 개수를 센다. (H라 한다.) <h 만큼 인용된 논문 수 H>
  4. H >= h 라면 종료하고 조건이 충족되지 못하면 h를 한개씩 낮춘다.

5. 코드

from functools import reduce

def f(x,y):
    return x + y

def solution(citations):
    
    n = len(citations) #1
    h = (reduce(f, citations) / n) #2 h번 

    while(True):
        H = list(filter(lambda x : x >= int(h), citations)) #3 H는 h번 이상 인용된 논문 수
        if(len(H) >= int(h)):
            return int(h)
        else: #못찾을시 기준점을 내려서
            h -= 1
  • lambda 함수를 이용하여 각 리스트를 더하기 위해 reduce를 사용했다.
    • 이를 사용하기 위해 각 요소를 더할 수 있는 f 함수를 정의해준다.
  • citations의 각 요소가 h보다 큰 경우의 개수만 센다.

6. 알아둘만한 문법

<lambda 함수>

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

from functools import reduce

def f(x,y):
    return x + y

h = (reduce(f, citations))

#출력 결과
15
  • 각 리스트 항목의 수를 lambda를 이용하여 모두 더할때 reduce를 사용한다. (정의하기 나름)

 

int(h) = 3
H = list(filter(lambda x : x >= int(h), citations))

#출력 결과
[3, 6, 5]
  • filter 함수와 lambda 함수를 이용하여 조건에 맞는 리스트 요소를 뽑아낸다.