본문 바로가기

알고리즘/프로그래머스

[프로그래머스][Python] H-Index

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 

h의 최댓값이 이 과학자의 H-Index입니다.

 

문제를 잘 이해해보자.

 

1) h번 이상 인용된 논문이 h편 이상이다.

2) 나머지 논문은 h번 이하 인용한다.

 

1), 2)를 만족하는 h의 최댓값을 구하여라

 

 

 

만든 예시

 

 

위 예시처럼, 먼저 배열을 오름차순으로 정렬한다. 

정렬하면 n - index는 해당 값의 편 수가 된다. ( 물론 내림차순으로 하고 index + 1을 편 수로 잡아도 된다. )

이때 각 값의 h값은 value와 n - index 중 더 작은 값이 된다.

예를 들어, 9번 이상은 4편이 있다. 여기서 h값으로 최대는 4이다. 

 

그리고 2)는 고려할 필요가 없다. 무조건 만족하기 때문이다.

 

 

추가로, value 값으로 9가 3번 나왔다. 이때 수기 작성한 것을 보면 h값이 모두 다르다.

사실 3개의 h값은 모두 같아야 한다. 하지만 이렇게 해도 가능한 이유는 최댓값을 찾기 때문이다.

다시 말해서 내림차순이기 때문에 '9번이상은 4편의 h는 4'를 찾게 되면 나머지 9번이상은 무조건 4보다 작다. 

 

 

 

 

문제 예시

 

 

문제에 나온 예시도 수기로 적어봤다.

 

 

 

 

#  enumerate 사용
def solution(citations):
    citations.sort()
    n = len(citations)
    answer = 0

    for index, num in enumerate(citations):
        tmp = min(num, n - index)
        answer = max(answer, tmp)

    return answer


print(solution([3, 0, 6, 1, 5]))


# 미사용
def solution(citations):
    citations.sort(reverse=True)
    n = len(citations)
    answer = 0

    idx = 1
    for num in citations:
        tmp = min(num, idx) # h의 값 
        answer = max(answer, tmp)  # h값 중에서 최댓값

        idx += 1

    return answer


print(solution([1, 9, 9, 9, 12]))

 

 

처음에는 h값 구하는 게 헷갈렸다. value를 h의 고정값으로 생각하고 n-index가 h보다 크거나 같으면 해당 index의 최대  h값으로 생각했다. 

 

하지만 [9, 9, 9, 12]를 예로 생각하면서 헷갈리지 않았다.

h를 고정값으로 생각하지 않고, value와 n-index를 비교해서 정했다.

 

 

아래는 다른 사람의 풀이이다.

 

 

 

def solution(citations):
    citations.sort(reverse=True)
    answer = max(map(min, enumerate(citations, start=1)))
    return answer

 

 

이 사람은 오름차순으로 풀었다. 

마찬가지로 min으로 각 index의 값마다 h의 값을 찾고,

h값들 중에서 max로 최대값을 찾았다.

 

 

def solution(citations):
    print(list(enumerate(citations, start=1)))

print(solution([9, 9, 9, 12]))

 

 

새롭게 알게된 점은 enmerate의 start값을 지정할 수 있다는 것이다.

 

 

enumerate 연습