본문 바로가기
[알고리즘] 문제 풀이

[정렬] 프로그래머스 - H-index

by yeon_zoo 2021. 10. 29.

문제 출처: https://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회 이하입니다.

입출력 예

citations return
[3, 0, 6, 1, 5] 3

 

문제 풀이 : 

def solution1(citations):
    answer = 0
    max_range = max(citations)
    min_range = min(citations)
    for i in range(max_range, min_range-1, -1):
        answer = 0
        for cit in citations:
            if cit >= i:
                answer += 1
        if answer >= i:
            answer = i
            break
    return answer

def solution(citations):
    citations.sort()
    n = len(citations)
    for i in range(n):
        if citations[i] >= n-i:
            return n-i
    return 0

solution1은 풀면서도 더 쉽게 풀 수 있는 방법이 분명히 있다고 느껴진 방법이다. citations의 최대값과 최소값을 i의 범위로 삼고, i가 최대에서 최소로 가면서 i번 이상 인용된 논문의 수를 찾는다. 그리고 해당 논문들의 수가 i보다 많다면 i 값을 return 해준다. 

 

하지만 매 i마다 모든 논문의 인용횟수를 다 돌면서 반복이 많이 사용되어서 좋은 알고리즘 같지는 않았다. 그래서 좀 더 고민해보고 solution과 같은 답을 찾을 수 있었다. 먼저 citations를 정렬한다. 이후 citations의 수까지 i가 범위를 돌면서 i번째 논문의 인용횟수가 n-i보다 크거나 같은지 확인한다. 만약 그렇다면 n-i 값을 반환해준다. 정리해보면 다음과 같다. 

 

[3, 0, 6, 1, 5] -> 정렬 후 : [0, 1, 3, 5, 6]

i 0 1 2 3 4
n - i
(citations[i]번 이상 인용된 논문의 수)
5 4 3 2 1
citations[i]
(i번째 논문 인용 횟수 - 이후의 모든 값은 i번 이상 인용되었음)
0 1 3 5 6

이 때 가장 먼저 i가 2일 때,  citations[2] >= n - 2 가 되므로 5-2 = 3 이 답이 된다. 이 때, 인용횟수가 0번인 논문만 존재하는 경우, 0값을 리턴해줘야 하므로 반복문을 다 돌았지만 return값이 없었던 경우만 0을 리턴해준다. 

댓글