728x90
반응형
H-index는 음... 연구자의 역량을 나타내는 지표..? 라는데
일단 문제 해설을 하면 예시로 보는것이 편하다.
ex) citations = [3, 0, 6, 1, 5] , return = 3
citations의 길이는 논문 수,
각 요소는 각 논문의 인용횟수이다. 즉, 0번 인덱스의 논문을 3회 인용했다는 것이다.
여기서 H-index는 n개의 논문 중, h번 인용된 논문의 갯수가 h개와 같거나 보다 커야한다.
물론 h는 h번 인용되거나 그보다 적게 인용된 논문의 갯수를 disused라 했을때,
h >= disused 여야한다. 이를 토대로 깊은 생각없이 바로 코드를 작성했다.
def solution(citations):
answer = 0
n = len(citations) # 논문 수
use_cnt = sum(citations) # 인용 수
avr_use = use_cnt//n # 평균 인용 수
while avr_use != 0 or avr_use != max(citations):
cnt = 0
for cit in citations:
if cit >= avr_use:
cnt += 1
if avr_use <= cnt and avr_use >= n-cnt:
answer = avr_use
break
elif avr_use > cnt:
avr_use -= 1
return answer
그런데 아무리 봐도 이건 너무 비효율적이다. 결과도 이를 뒷받침하듯 괴랄한 실행시간을 보여줬다.
다시 생각해봤다. 정렬시킨 후 인덱스로 어떻게 하는 방법 없을까 생각했는데 어떤 한 천재 개발자가 쓴 풀이가 있어서 그걸 참고했다.
일단 citations를 내림차순으로 정리.
이후 enumerate로 인덱스와 쌍을 이뤄 정리. (start = 1)
그러면 각 인용수를 h라고 생각했을때 인덱스는 citations 안에서 h보다 큰 수 논문의 수가 된다.
즉, (6, 1) (5, 2) (3, 3) (1, 4) (0, 5) 그렇담 h 로 나올 수 있는 수는 1, 2, 3, 1, 0 이중 가장 큰걸 고르면 정답 h 가 된다.
def solution(citations):
answer = 0
citations.sort(reverse=True)
answer = max(map(min, enumerate(citations, start=1)))
return answer
여튼 대단한 사람이 많다.
728x90
반응형
'알고리즘 > python' 카테고리의 다른 글
[softeer] lv3 우물 안 개구리_python (0) | 2024.03.25 |
---|---|
[softeer] lv3 출퇴근길_python (0) | 2024.03.25 |
[프로그래머스] lv2 줄 서는 방법_python (5) | 2024.03.22 |
[프로그래머스] lv2 배달_python (2) | 2024.03.22 |
[프로그래머스] lv2 JadenCase 문자열 만들기_python (0) | 2024.03.22 |