기록하는삶

[코딩 테스트 연습(파이썬/Python)] 프로그래머스 _ H-index 본문

카테고리 없음

[코딩 테스트 연습(파이썬/Python)] 프로그래머스 _ H-index

mingchin 2021. 10. 2. 01:37
728x90
반응형

https://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를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

 

[제한 조건]

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

어렴풋이 기억에 남았던 bisect를 이용했다. 

# 통과
import bisect
def solution(citations):
    citations.sort()
    N = len(citations)
    h, b = 0, 0 
    for i in range(citations[-1]):
        if i in citations:
            b =  N - bisect.bisect(citations, i) + citations.count(i)
        else:
            b =  N - bisect.bisect(citations, i)
        if  i <= b:
            h = i
    return h

max 값을 구하는 것이고, h보다 크거나 같은 갯수가 h개 이상이면, 반대는 당연히 성립할 것이기에 다음과 같이 한 쪽만 확인해도 된다. 맨 처음에 했던 생각에 가장 가까운 풀이인 것 같다. 

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

뭔소린지 모르겠는 신의 코드..

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

enumerate 안에서 start는 시작 index를 지정한다.

아이디어 자체는 유사하다. 숫자들 사이에 1,2,3,4,5, ... 의 기준 선을 긋는다고 생각하고, 해당 숫자를 원하는 범위에 포함시키기 위한 H-index 후보 값을 min을 통해 찾는다. 마지막으로 그 중 최댓값으로 답을 구하는 코드다.

뒤에서 부터 index로 접근하여 범위에 포함되는 수의 개수를 전체 길이와 index의 차로 생각한다는 점에서(아래 코드는 거꾸로니까 1부터 시작하는 index 자체가 개수를 의미) 동일하지만, 알고 봐도 이해하기가 어렵다. 이런건 누가 생각할까,,,,,

(1,6), (2,5) 에서 min으로 각각 1, 2가 선택됨으로써 5,6은 H-index의 후보에서 제외된다. 반면 4이상인 것이 6개까지도 있는 - (6,4)가 말해준다 - 4는 H-index의 후보로 채택된다. 

 

728x90
반응형