-->

[프로그래머스] 정렬 - H-Index (파이썬)

프로그래머스 정렬 - H-Index, 문제 확인

처음 읽었을 때는 쉽다고 생각했는데 풀면 풀수록 문제가 난해했다. 처음부터 확실히 이해하고 넘어가면 금방 풀수 있는데 제대로 이해한 줄 알았던게 완전 아니었어서 삽질을 좀 했다.

 


"어떤 과학자가 발표한 논문 n편 중, h이상 인용된 논문이 h이상이고

나머지 논문h이하 인용되었다면,

h의 최댓값이 H-Index가 됨"

 

 

즉, [3,0,6,1,5] 에서 3회 이상 인용된 논문은 3,5,6 으로 3편 이상이고 나머지 논문 0,1이 3회 이하 인용되었기 때문에 리턴값은 3이 된다. 처음엔 3회 이상 인용된 논문이 3편이고 3회 이하 인용된 논문이 3편이기 때문에 3인 것으로 착각했다.

 

따라서 [22,42]의 경우 2번 이상 인용된 논문은 22,42로 2편 이상이고 나머지 논문이 (없는 경우를 그냥 0으로 치는 듯) 2번 이하로 인용되었기 때문에 리턴값이 2가 된다. h번 이상 인용된 논문이 h편 이상이어야 하기 때문에 최솟값이 논문 수보다 크다면 결국 리턴값은 논문 수인 citations의 길이가 된다. 

 

혹시 분명히 맞는 것 같은데 모든 테스트케이스가 통과가 되지 않는 기이한? 현상이 있다면 아래 테스트케이스를 추가해 확인해보길 바란다.

 

  • [3,0,6,1,5] -> 3

  • [20,19,18,1] -> 3

  • [22,42] -> 2

  • [5,5,5,5] -> 4

 

 

프로그래머스 정렬 - H-Index, 문제 풀이 (파이썬)

따라서 먼저 citations를 sort()로 정렬해준 후, 0부터 citations의 최댓값까지 반복문을 돌렸다. 반복문 내에서 citations 내의 인용값 중 i번 이상 인용된 논문수인 h와 i번 이하 인용된 논문수인 k를 구한다. i번 이상 인용된 논문수 h가 i 이상이고 i번 이하 인용된 논문수 k가 i 이하인 조건을 만족하는 answer 값 중 최댓값을 리턴하면 된다.

 

그리고 추가적으로 위에서 설명했던 "h번 이상 인용된 논문이 h편 이상이어야 하기 때문에 최솟값이 논문 수보다 크다면 결국 리턴값은 논문 수인 citations의 길이가 된다"를 만족시켜주기 위한 조건문을 맨 하단에 추가했다.

 

def solution(citations):
    citations.sort()
    h = 0; k = 0; answer = 0
    for i in range(0, citations[-1]+1):
        h = sum(j>=i for j in citations) # i번 이상 인용된 논문수인 h를 구함
        k = sum(j<=i for j in citations) # i번 이하 인용된 논문수인 k를 구함
        if h >= i and k <= i : # h가 i 이상이고 k가 i 이하인 조건을 만족하는 값을 구함
            if i>answer : answer=i # 그중에 최댓값을 구함
    if citations[0] >= len(citations) : answer = len(citations)
    return answer

 

 

삽질 끝에 모든 테스트 케이스를 통과할 수 있었다.

 

 

댓글

Designed by JB FACTORY