문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42747
먼저, 인풋으로 각각의 쓴 논문의 인용 횟수가 들어있는 list인 citations이 주어진다.
이때, 논문 n편 중 h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index이다. 이 H-Index를 찾아 리턴하는 것이 목적이다.
def solution(citations):
# 인용 수의 최댓값이 0이면 바로 0을 리턴
if max(citations) == 0:
return 0
# 내림차순으로 정렬
citations.sort(reverse=True)
for length in range(len(citations)+1, 1, -1):
check = 0
for cit in citations:
if cit >= length:
check += 1
if check == length:
return check
else:
break
먼저, 주어진 배열의 max값이 0이면 그냥 바로 0을 리턴해준다.
그렇지 않는 경우 sort + reverse로 내림차순 정렬을 해준다.
내림차순된 배열의 길이로 for문을 1씩 줄어드는 방향으로 돌리고, 그 안에 그냥 내림차순된 배열로 for문을 돌려 총 이중 for문을 만들어준다.
그리고 check로 인용수가 h편 이상인 논문이 발견될 시 +1을 해주어 갯수가 h가 되면 리턴을 해준다.
def solution(citations):
sorted_citations = sorted(citations, reverse=True)
for i in range(len(sorted_citations)):
if sorted_citations[i] <= i:
return i
return len(sorted_citations)
다른 사람의 풀이를 보니 굳이 이중 for문과 check를 만들지 않고, 내림차순으로 정렬되어 있기 때문에 i번째까지만 확인 후 리턴해주는 방식을 사용하였다.
코드가 짧아졌을 뿐만 아니라 시간 효율성도 더 좋아졌다.