본문 바로가기

3. 알고리즘/프로그래머스

[python/정렬] 36. H-Index

728x90

문제 출처

programmers.co.kr/learn/courses/30/lessons/42747

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

 

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과에 따르면, 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입니다.

 


나의 코드-1(실패, 정확성: 93.8)

def solution(citations):
    for x in range(max(citations), min(citations)-1, -1):
        if sum(y >= x for y in citations) >= x:
            return x
            break

citations이라는 문자 배열의 최대값부터 최소값까지 내림차순으로 x를 지정해서 for문을 만들어줬다.

조건을 만족하면 바로 x를 반환한다.

 

9번 테스트케이스를 통과하지 못해서 정확성을 93.8를 기록했다.

9번 테스트케이스는 citations: [8, 9, 10, 11], return: 4와 같은 형식인데

나는 애초에 for문의 범위를 citations의 최댓값과 최소값으로 지정했기 때문에 제대로된 답을 출력시키지 못했던 것이다.

따라서 아래와 같이 citations의 최소값이 citations의 길이보다 큰 경우 citations의 길이를 출력해주는 코드를 추가해줬다.

 

나의 코드-2

def solution(citations):
    if min(citations) > len(citations):
        return len(citations)
    else:
        for x in range(max(citations), min(citations)-1, -1):
            if sum(y >= x for y in citations) >= x:
                return x
                break

짠✨

 

다른 풀이-1

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

최종적으로 출력되는 h값은 citations의 길이를 초과할 수 없기 때문에 for문의 범위를 citations의 길이 만큼만 지정해준다.

그리고 citations[i]가 l-i보다 크면 l-i를 반환하는 조건문을 만들어줬다. 이것을 예시1을 가지고 표로 나타내면 아래와 같다.

citations[i] 0 1 3 5 6
l-i 5 4 3 2 1

여기서 l-i는 citations[i]보다 큰 논문의 개수를 의미한다.

 

다른 풀이-2

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

별표를 친 풀이에 대해 풀이를 해보자면, enumerate(citations, start=1)를 통해 (6, 1), (5, 2), (3, 3), (1, 4), (0, 5)를 얻을 수 있다.

1번 풀이의 표 형태와 비슷하다.

map으로 각각의 경우의 최소값을 구한다. 1, 2, 3, 1, 0이 저장되어 있을 것이라고 예상할 수 있다.

이후에 이 값들의 최댓값을 구하면 문제에서 구하는 3이라는 답을 얻을 수 있다.

 

'(6, 1), (5, 2), (3, 3), (1, 4), (0, 5) 각각의 최소값의 최댓값이 h다'라는 논리를 이해하는 것이 어렵지만 확실히 멋있는 코드다..!

 

 

 

728x90