
난이도 : level 2
유형 : 정렬
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/42747
이 문제에선 citations, 즉 인용 횟수를 담은 배열을 입력받는다.
배열의 길이는 과학자가 발표한 논문의 수이며, 배열의 각 요소는 논문별 인용 횟수이다.
예를 들어 citations = [3, 0, 6, 1, 5] 라면,
과학자가 총 5편의 논문을 발표했고 각각 3번, 0번, 6번, 1번, 5번 인용되었음을 의미한다.
여기서 우리가 구해야 할 값은 H-index다.
H-index는 논문의 생산성과 영향력을 동시에 보여주는 지표다.
위 배열에서의 H-index는 3이다.
왜 3인지 역으로 들어가보자.
먼저 편하게 비교하기 위해 오름차순 정렬을 해준다.
[0, 1, 3, 5, 6]
이 배열의 H-index가 3인 이유는 다음과 같다:
만약 H-index가 4라고 가정해보자.
그렇다면 4번 이상 인용된 논문이 4편 이상 있어야 한다.
하지만 배열을 보면 4번 이상 인용된 논문은 2편(5, 6)뿐이다.
따라서 H-index = 4는 성립하지 않는다.
즉, 이 케이스의 H-index는 3이다.
H-index를 구하는 방법은 간단하다.
num번 이상 인용된 논문이 num편 이상)을 만족하는지 검사한다. 단, 배열의 길이와 값의 범위가 크기 때문에,
오름차순 정렬 후 순회하며 조건을 만족하는 최대 H-index를 갱신하는 방식으로 풀면 된다.
def solution(citations):
# 1. 오름차순 정렬
sorted_citations = sorted(citations)
n = len(sorted_citations)
# 2. H-index 조건을 만족하는지 확인하는 함수
def is_Hindex(num):
count = 0
for c in sorted_citations:
if c >= num: # num번 이상 인용된 논문이면 카운트
count += 1
if count >= num:
return True
else:
return False
# 3. H-index 후보를 0부터 n까지 전부 검사
h = 0
for candidate in range(n + 1):
if is_Hindex(candidate):
h = candidate # 조건 만족하면 갱신
return h