문제
https://school.programmers.co.kr/learn/courses/30/lessons/42747
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회 이하입니다.
입출력 예
나의 풀이1 (실패)
def solution(c):
answer = 0
c.sort()
for i in range(len(c)):
if len(c[i:]) >= c[i] and len(c[:i]) <= c[i]:
answer = c[i]
elif len(c[i:]) < c[i]:
break
return answer
- 처음엔 입력값으로 받은 논문 안에서만 계산하면 되는 줄 알고 풀어서 실패했다.
나의 풀이2 (성공)
def solution(c):
c.sort()
answer = 0
i = 0
for v in range(max(c)):
if v > c[i]:
i += 1
if len(c[i:]) >= v and len(c[:i]) <= v:
answer = v
elif len(c[i:]) < v:
break
return answer
배열을 오름차순 정렬한 후, 슬라이스한 리스트의 길이를 통해 각 값이 조건을 만족하는지 확인하여,
가장 큰 H-Index 값을 구하는 방식으로 풀었다.
근데 문제를 다 풀고 보니 입력받은 리스트의 최대값만큼 for문을 실행하는 게
너무 비효율적인 거 같아서 풀이를 좀 수정했다. 👇
나의 풀이3 (성공)
def solution(c):
c.sort(reverse=True)
answer = 0
for v in range(1, len(c) + 1):
if c[v-1] >= v:
answer = v
return answer
리스트를 내림차순으로 정렬한다.
개수를 통해 H-Index를 구하기 때문에 최대 출력값은 리스트의 길이를 넘어설 수 없다.
리스트의 길이만큼 for문을 실행하면서 해당 인덱스(`v-1`)의 논문 인용 횟수가 v 이상인지를 판별한다.
예를 들어 예제의 리스트를 내림차순으로 정렬하면 `[6, 5, 3, 1, 0]`이 된다.
`v = 3`일 때 `c[2] = 3`이 되는데,
이는 리스트 앞에서부터 `c[2]`까지 모든 원소가 3편 이상이라는 조건을 충족했다는 것을 의미한다.