알고리즘

H-Index - 프로그래머스 Python

침착하고 가야할 곳에만 집중하는 달팽이 2026. 3. 3. 15:48
문제: 
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. 정렬하면 i번 이상 인용된 책이 몇 권 있는지 확인하기 편해짐 => 정렬, 그리디 문제

 

내 풀이: 

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

 

히든 테케를 미리 방어하고 코드를 깔끔하게 짜기 위해서는 좀 극단적인 테케를 많이 적용해보고 생각해 봐야 할 것 같다. 

더 나은 다른 사람 풀이: 

출처:

https://school.programmers.co.kr/learn/courses/30/lessons/42747/solution_groups?language=python3&type=all

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

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

 

enumerate(citations, start=1) 을 사용해서 아주 간결하게 푼 방법이다..!

(1, 6)
(2, 5)
(3, 3)
(4, 1)
(5, 0)

(현재 책의 인용수 이상으로 인용수를 가진 책의 수 , 현재 책의 인용수) 이렇게 나온다. 

이렇게 튜플이 나오면 min() 으로 이 중에서 작은 애를 골른다. 

(1, 6) → min(1,6) = 1
(2, 5) → min(2,5) = 2
(3, 3) → min(3,3) = 3
(4, 1) → min(4,1) = 1
(5, 0) → min(5,0) = 0

그리고 이 값 중에서 가장 큰 수를 구한다.

max([1, 2, 3, 1, 0]) = 3

짠..!