[프로그래머스] H-Index

ddurru·2024년 12월 29일
0

코딩테스트

목록 보기
12/15

문제 설명
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회 이하입니다.

풀이 00

def solution(citations):
    citations.sort(reverse=True) # 내림차순 정렬 
    
    for idx, num in enumerate(citations):
        if idx+1 > num: # 인덱스+1이 인용 수를 초과할 경우
            return idx  # 이전까지의 값이 h-index
    return len(citations) # 모든 논문이 조건을 만족할 경우, 전체 논문 수 반환

사실 이 문제는 문제 내용의 파악이 제일 어려웠던 거 같다.
h-index 위키피디아 내 적힌 내용은 다음과 같다.

h-index는 h 개의 논문이 각각 최소 h개의 인용을 갖는 가장 큰 h 입니다. 예를 들어, 저자가 9, 7, 6, 2, 1개의 인용(가장 큰 것부터 가장 작은 것 순으로 정렬)을 가진 5개의 출판물을 가지고 있다면, 저자의 h-index는 3입니다. 왜냐하면 저자가 3개 이상의 인용을 가진 3개의 출판물을 가지고 있기 때문입니다. 그러나 저자는 4개 이상의 인용을 가진 4개의 출판물을 가지고 있지 않습니다.

h-index를 구하기 위해서는 내림차순으로 정렬을 해줘야 하며 리스트 n번째 값이 n을 최초로 넘지 않을 경우 n-1이 h-index 값이 되는 것이다.

표로 나타내면 다음과 같다.

index+1citations기준
166>1
255>2
333=3
411<4 ✅
50

3번째 리스트의 값이 순번보다 크거나 같지만 4번째의 경우 리스트의 값이 순번보다 작기 때문에 조건에 부합하는 마지막 순번은 3이 된다.

이를 활용해서 인용 수를 초과할 경우를 고려하여 이전까지의 인덱스 값을 구하고자 하였으며, 모두 조건을 만족할 경우에는 전체 논문의 길이를 반환하고자 했다.

풀이 01

def solution(citations):
    citations.sort(reverse=True) # 내림차순 정렬 
    h_index = 0
    
    for idx, num in enumerate(citations):
        # h-index 조건을 만족하므로 h_index 값을 갱신
        if num >= idx + 1:
            h_index = idx + 1
        else:
            # 조건이 만족되지 않으면 이후 논문은 더 적은 인용 수를 가지므로
            # 반복문을 중단하고 현재 h_index를 반환
            break            
    return h_index 

기존 코드의 경우 h_index를 갱신하고 반환하는 방식으로 처리하고자 했다. 하지만 break 후에도 return h_index까지 도달해야 하므로 코드 흐름이 약간 더 복잡하다는 것을 알 수 있었다.
따라서 조건이 만족되지 않는 순간 즉시 return으로 결과를 반환하므로 연산량을 줄이고자 코드를 풀이 00으로 개선했다.

profile
2024.04.15 ~

0개의 댓글