[프로그래머스/Lv.2] H-Index | 파이썬 Python

문제

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편 이상이라는 조건을 충족했다는 것을 의미한다.