FrontEnd
Javascript
Diary
ML
CS
Django
Algorithm
AWS
Co-Work
HTML
CSS
Python
React
ReactNative

#51 알고리즘 연습 - H-index(Python)

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입니다.

문제풀이 IDEA
주어진 list는 뒤죽박죽으로 되어있으므로 정렬을 한다음에 정렬된 element들을 기준으로 해서 풀고자했다. 그런데 주의해야할것이 list의 element값이 정답이 되기에는 [10,100]과 같은 경우에는 둘다 10번 이상 인용되었지만 h가 횟수뿐만아니라. 갯수도 나타내고 있으므로 마냥 element의 value값으로 비교해보기에는 무리가 있다.

내 풀이 🏆

def solution(cita):
    answer = 0
    cita.sort()
    for i in range(len(cita)+1):
        cnt = 0
        for j in cita:
            if j >= i:
                cnt+=1

        if cnt >= i:
            answer = i
    return answer

그래서 내 풀이를 보면 그닥 효율적이거나 이쁘진 않지만… 오름차순으로 정렬해준다음 h가 나타내는게 갯수라는 제한이 있으므로 최대로 가질수있는 list의 len안에서 원소들과 비교 count해주어 횟수 조건에도 부합하는지 해주었다.

하지만 이중 for문을 안쓰고도 할수 있을것 같은데 아쉬움이 남는 풀이이다.

다른 풀이 🏆

def solution(citations):
    citations = sorted(citations)
    l = len(citations)
    for i in range(l):
        if citations[i] >= l-i:
            return l-i
    return 0

위의 코드를 보면 진짜 이쁘게 잘 짰다. sorted 로 정렬을 해주고, 전체 len보다 작은 범위의 값을 가지기 때문에 첫번째 for문의 기준을 len으로 잡은것까지는 유사하지만 이후에 각 index의 value를 비교해주는데 특이하게 value는 index를 앞에서 부터 해서 비교를 하지만 갯수는 뒤에서 부터 counting을 하는 방식으로 했다.

이를 이해하기위해서 앞에서 뒤에서라는 말보다 우리가 쓰는 말로 풀어보면 내가 지금 위치한 index의 값이 이 뒤에 나오는 갯수를 커버할수 있는가?? 이다 나는 크기를 기준으로 이후의 갯수를 대조하면서 해당하면 다음 다음 이런 식이었는데 관점을 바꾸어 이후의 갯수를 기준으로 크기와 비교를 하니 더 효율적인 코드 작성이 가능했다.

문제풀이에서 A라는 방법을 어떻게 구현을 할까 생각을 하는것 뿐만 아니라 A’라는 방법으로는 어떻게 할수없을까 생각해보는 것도 좋은 방향의 결과를 가져올수 있다는 것이다.