문제설명
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입니다.
프로그래머스의 문제 대다수를 읽고 느끼는 거지만 이 문제도 역시나 처음 읽었을 때 문제가 이해되지 않았다. 입출력 예와 설명을 토대로 정리하면, 위 예에서 n=5이고, 3번(citations[0]), 6번(citations[2]), 5번(citations[4]) 논문 3개 3번이상 인용 되었고 0번(citations[1]), 1번(citations[3]) 논문 2개는 3번 이하 인용되었다.
H-index의 개념이 없어서 그런건지, 여러번 읽어보아도 이해할수없어 H-Index의 개념을 더 찾아보았다. H-index 개념과 계산, h-index 앞의 두 블로그에 따르면 H-index는 다음과 같이 계산할 수 있다.
- 각 논문들의 인용 횟수를 조사한다
- 연구자의 논문을 인용 횟수를 기준으로 내림차순 정렬한다
- 인용횟수와 논문의 순서(Index)가 같거나 인용횟수가 더 높은 구간까지의 논문 편수를 구한다
1차 코드는, 위 개념을 다 찾아보진 않고 H-index가 내림차순 정렬한 뒤에 인용횟수와 논문 편수가 일치하는 지점일 때를 리턴한 코드다.
def solution(citations):
c = sorted(citations, key=lambda x:-x)
for i in range(len(c)):
if i+1 == c[i]:
return i+1
1차 코드는, 논문 인용 편수와 인덱스가 일치하지 않을 때엔 실패한다. 언제나 편수와 인덱스가 같지 않음을 알아 차리고 계산 공식의 3번을 적용해서 2차 작성 코드에선 인용횟수가 더 높은 구간까지의 논문 편수
를 출력해보았다.
#1. 각 논문들의 인용 횟수를 조사한다
#2. 연구자의 논문을 인용 횟수를 기준으로 내림차순 정렬한다
#3. 인용횟수와 논문의 순서(Index)가 같거나 인용횟수가 더 높은 구간까지의 논문 편수를 구한다
def solution(citations):
ans = 0
c = sorted(citations, key=lambda x:-x)
for i in range(len(c)):
if i+1 > c[i]:
break
else:
ans = i+1
return ans