알고리즘 풀이/프로그래머스

[Level 2] H-Index

mhko411 2021. 3. 3. 23:33
728x90

programmers.co.kr/learn/courses/30/lessons/42747?language=python3#

 

코딩테스트 연습 - H-Index

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

programmers.co.kr


접근

문제를 이해하는데 어려움을 겪었고 많은 테스트 케이스를 놓쳤다.

먼저 인용횟수가 입력되는데 해당 인용횟수 중에서 h편 이상 인용된 논문이 h 이상일 때를 찾는 줄 알았다. 하지만 인용횟수가 담긴 리스트가 아닌 0회에서 10,000회 이하의 수 중에서 조건에 부합하는 h를 찾는 것이다.

 

또한 h편 이상인 논문이 h이상이고 나머지는 h편 이하라고 했다. h가 겹치는데 어떻게 처리해야할지 고민이 있었다. 이를 한 번은 h편 이상인 논문을 카운트하고 한 번은 h편 초과한 논문을 카운트하여 조건에 부합하는 h를 찾았다.

 

구현

n부터 내림차순으로 h를 찾도록 하였다.

n은 citations의 길이와 citations에 있는 횟수 중 최댓값에서 최솟값을 갖도록 한다. 왜냐하면 둘 중 하나인 값까지만 검사하면 되고 (31, 66) 일 때 31과 66은 볼 필요가 없고 길이인 2까지만 보면 된다.

 

이후 h편 이상인 논문과 h편 초과인 논문을 찾고 조건에 부합했을 때 answer에 h를 담고 break를 한다.

조건에 부합하는 것은 이상이거나 초과를 카운트하는 up과 h가 같을 때이다.

def solution(citations):
    answer = 0
    n = min(len(citations), max(citations))
    
    for i in range(n, -1, -1):
        h = i
        up = down = 0
        # h편 이상인 논문 카운트
        for c in citations:
            if c >= h:
                up += 1
            else:
                down += 1
        if h==up:
            answer = h
            break
        up = down = 0
        # h편 초과인 논문 카운트
        for c in citations:
            if c > h:
                up += 1
            else:
                down += 1
        if h==up:
            answer = h
            break
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 최댓값과 최솟값  (0) 2021.03.04
[Level 2] 소수 찾기  (0) 2021.03.04
[Level 3] 여행 경로  (0) 2021.03.03
[Level 2] 타겟 넘버  (0) 2021.03.03
[Level 3] 가장 먼 노드  (0) 2021.03.02