문제설명
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인
h
를 구하려고 합니다. 위키백과에 따르면, H-Index는 다음과 같이 구합니다.어떤 과학자가 발표한 논문
n
편 중,h
번 이상 인용된 논문이h
편 이상이고 나머지 논문이h
번 이하 인용되었다면h
의 최댓값이 이 과학자의
H-Index입니다.어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
- 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
이 문제를 풀기 위해선 H-index에 대한 정확한 이해가 필요하다.
많은 사람들, 나를 포함해서 H-index는 citations의 값 중 하나일 것이라고 생각하는데 이는 큰 오산이다.
문제의 예시에 나온 배열에서 3이 H-index라고 소개되었는데
공교롭게도 해당 배열의 길이는 5, 그리고 3회 이상 인용된 논문은 딱 3회이기 때문에 많은 사람들이 citations의 값 중 하나일 것이라고 생각할 수 있다.
H-index는 어떤 논문에 대해 인용 횟수가 x라고 한다면
H-index는 x이하의 값 중 하나의 값이 된다.
예로, 배열 citations가 [88, 89]라면 이 citations에 대한 H-index는 2이다.
그래서 이를 위해 이중 for문을 사용,
첫 번째 for문에선 citations의 모든 인덱스에 접근하기 위해
두 번째 for문에선 citations의 각 원소의 값까지 접근을 위해 사용했다.
먼저 정렬된 citations에서, i번 이상 인용된 논문은 해당 인덱스를 포함한 이후의 인덱스 모두의 개수와 같다.
따라서 두 번째 for문에서 위 조건을 이용하여 j를 증가, 이를 h_temp라는 배열에 넣고 이중에 최대값을 반환하도록 하였다.
예외로, citations의 길이가 1이고 이 값이 0이 아니라면 무조건 H-index는 1이다.
그리고 만약 원소의 값이 0이라면 이는 h_temp에 0을 넣는 조건으로 따로 처리했다.
def solution(citations):
answer = 0
citations.sort()
h_temp = []
if len(citations) == 1:
return 1
for i in range(0, len(citations)):
if citations[i] == 0:
h_temp.append(0)
else:
for j in range(0, citations[i]):
if j + 1 <= len(citations) - i:
h_temp.append(j + 1)
answer = max(h_temp)
return answer