출처:https://programmers.co.kr/learn/courses/30/lessons/42747
코딩테스트 연습 - H-Index
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표
programmers.co.kr
문제 설명
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회 이하입니다.
입출력 예
citationsreturn
[3, 0, 6, 1, 5] | 3 |
h번 이상 인용된 논문이 h편 이상이고 나머지는 전부 h번 이하로 인용될 때 h의 최댓값 구하기다.
나머지가 h번 이하로 인용되는건 내림차순을 쓰면 알아서 해결된다.
그럼 이제 핵심은 h번 이상 인용된 논문이 h편 이상인지 찾는 알고리즘인데,
나는 일단 그냥 구현으로 갔다.
h=0부터 시작해서
h보다 값이 크거나 같을 경우에만 cnt를 증가시키고
그cnt가 h보다 크면 h편이상 논문이 인용된것이니 h를 1증가시키고
아니면 현재h-1을 출력한다.
def solution(citations):
h=0
citations.sort(reverse=True)
while True:
cnt = 0
# h번 이상 인용된 논문개수 세기
for i in citations:
if i>=h: cnt+=1
else: break
#인용된 논문개수가 h편이상이면 H-INDEX갱신
if cnt>=h: h+=1
elif cnt<h:
h-=1
break
return h
답안중 정말 신선한 풀이방식을 찾았다.
내림차순 후
enumerate(c,start=1)을 예제로 예를 들면
[(1, 6), (2, 5), (3, 3), (4, 1), (5, 0)]
이렇게 1부터 index를 채워서 튜플로 반환한다.
여기서 min으로 뽑으면
[1, 2, 3, 1, 0]
이런결과가 나온다.
이부분에서 1부터 시작하는 index(0번째 값들)들의 의미가 2가지를 가진다.
하나는 지금까지의 논문의 개수가 된다.
두번째는 논문의 인용횟수의 의미를 가진다.
여기서 min을 사용하게 되면
인용횟수가 같을 때까지 index는 지금까지 인용한 논문의 개수와 인용횟수 2가지의 의미를 갖고,
index가 더 커져버린다는 뜻은 현재 논문의 인용횟수가 더 작다는 뜻이므로 인용한 논문의 개수에 추가 될 수 없다.
즉 min으로 뽑아낸 값들중에서 최대값은 그 값만큼의 인용횟수를 가진 논문의 개수중 최대값, h의 최대값이 되는 것이다.
def solution(citations):
citations.sort(reverse=True)
return max(map(min,enumerate(citations,start=1)))