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. 풀이 접근
- 배열의 수를 논문 횟수인 n으로 설정한다.
- 리스트의 각 요소를 모두 합한 후 n으로 나눈다. (h라 한다.) <h번 이상 인용된 논문을 찾자 >
- 각 리스트 요소를 비교해서 h번 이상 인용된 논문의 개수를 센다. (H라 한다.) <h 만큼 인용된 논문 수 H>
- 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 함수를 이용하여 조건에 맞는 리스트 요소를 뽑아낸다.
'CodingTest > 정렬 알고리즘' 카테고리의 다른 글
프로그래머스 (Level 2) - 가장 큰 수 (0) | 2022.08.06 |
---|---|
프로그래머스 (Level 1) - k번째 수 (0) | 2022.08.06 |
두 배열의 원소 교체 (0) | 2022.07.08 |
정렬 알고리즘 종류와 특징 비교하기 (0) | 2022.07.08 |
계수 정렬 (0) | 2022.07.08 |