TIL - algorithm - 정렬

김영훈·2021년 9월 18일
1

ETC

목록 보기
31/34

문제 설명

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회 이하입니다.

입출력 예

citationsreturn
[3, 0, 6, 1, 5]5

풀이

  • H-Index의 값이 되려면 두 가지 조건을 만족해야 한다.

    • 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되어야 한다.

    • 위 조건을 만족하는 값 중 최댓값이어야 한다.

  • 우선 첫 번째 조건을 만족시키는 값을 구해보자. 로직을 짜기 전에, 우선 문제 풀이의 실마리가 되는 법칙을 하나 발견해야 한다. 바로 H-Index는 절대로 과학자가 발표한 전체 논문 개수(=len(citations)) 보다 클 수 없다는 사실이다. 이렇게 볼 때 H-Index는 반드시 range(len(citations)+1) 범위 안에 있으므로, for loop를 활용해 완전 탐색을 하도록 하자.

def solution(citations):
    answer = 0
    
    h_i = []
    for i in range(len(citations)+1):
        pass
        
    return answer
  • 다음으로, 순회하는 정수 i가 첫 번째 조건을 만족할 때, 객체 h_i에 추가하는 로직을 짠다. 변수 answer은 필요 풀이에 사용되지 않으므로 삭제한다.

  • h_i에 담긴 정수 중 최댓값이 H-Index에 해당하므로 해당하는 값(h_i[-1])을 return시킨다.

def solution(citations):
    h_i = []
    
    for i in range(len(citations)+1):
        h_c = 0
        for c in citations:
            if c >= i:      # 논문 인용 횟수 c가 i 이상인 경우 변수 h_c의 값을 증가시킨다.
                h_c += 1

        if h_c >= i:        # 값 h_c가 i 이상이면 h_i에 i값을 추가한다.
            h_i.append(i)

    return h_i[-1]
profile
Difference & Repetition

0개의 댓글