*문제 출처는 프로그래머스에 있습니다.
문제 제목: H-index (2단계)
문제 사이트:
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] | 3 |
입출력 예 설명
이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.
나의 풀이 - 1번째 풀이 ( 테스트 통과, 문제 오답)
def solution(citations):
answer = 0
cnt = 0
citations.sort()
for i in range(len(citations)):
H_index = len(citations) - i
if len(citations[H_index:]) >= H_index:
return H_index + 1
return answer
나의 풀이 - 2번째 풀이 (테스트 통과, 문제 10점)
def solution(citations):
answer = 0
cnt = 0
citations.sort(reverse = True)
for i in range(len(citations)):
if len(citations[i:]) >= citations[i]:
answer = citations[i]
break
return answer
처음에 내가 이상한건지, 문제가 이상한건지 정말 안풀렸다.
문제에서 핵심은 "n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면"라는 문장이다.
일단 H-index의 원래 의미를 살펴보자.
H-지수란?
H-지수는 특정 연구원의 연구 성과를 평가하기 위한 지표로써, 발표한 논문수와 피인용수를 이용하여 보다 객관적으로 학문적 역량을 측정할 수 있습니다. H-지수는 개인뿐만 아니라 연구단체, 기관 또는 국가의 연구 성과를 측정하는 데에도 활용되고 있습니다.
H-지수 구하는 방법
나의 h는 어떻게 구할 수 있을까? 우측의 표와 같이 자신이 저널에 등재한 전체 논문중 많이 인용된 순으로 정렬한 후, 피인용수가 논문수와 같아지거나 피인용수가 논문수보다 작아지기 시작하는 숫자가 바로 나의 h가 됩니다. 이 표에서는 10이 H-지수가 되는 것입니다. 다시 말하여, 이 연구원은 논문 인용횟수가 10이 넘는 논문이 적어도 10편이 된다는 것을 의미합니다.
출처: [BRIC Bio통신원] [연구논문을 위한 핵심 10단계] H-지수(H-Index) 란 무엇인가? ( https://www.ibric.org/myboard/read.php?Board=news&id=270333 )
즉, 피인용수가 논문수와 같아지거나 피인용수가 논문수보다 작아지기 시작하는 숫자가 H-index라는 말이다.
그러므로, citations를 오름차순으로 정렬하여 처음에는 citations에서 가장 큰 값의 인덱스(len(citations))를 H-index로 설정하여 해당 H-index가
예시) citations = [3,0,6,1,5] 는
총 발간된 논문: len(citations) = 5
0번 인용된 논문은 1개 있음, 0번 이상 인용된 논문은 5개 있음
1번 인용된 논문은 1개 있음, 1번 이상 인용된 논문은 4개 있음
2번 인용된 논문은 0개 있음, 2번 이상 인용된 논문은 3개 있음
3번 인용된 논문은 1개 있음, 3번 이상 인용된 논문은 3개 있음 -> n번 이상 인용된 논문이 n개임 ( 같아지는 지점 )
4번 인용된 논문은 0개 있음, 4번 이상 인용된 논문은 2개 있음 -> 줄어드는 지점
5번 인용된 논문은 0개 있음, 5번 이상 인용된 논문은 1개 있음
6번 인용된 논문은 0개 있음, 6번 이상 인용된 논문은 1개 있음
다른 예시) citations = [7,8,0,6,1,5]
총 발간된 논문: len(citations) = 6
-> 오름차순 정렬: citations = [0,1,5,6,7,8]
0번 인용된 논문은 1개 있음, 0번 이상 인용된 논문은 6개 있음
1번 인용된 논문은 1개 있음, 1번 이상 인용된 논문은 5개 있음
2번 인용된 논문은 0개 있음, 2번 이상 인용된 논문은 4개 있음
3번 인용된 논문은 0개 있음, 3번 이상 인용된 논문은 4개 있음
4번 인용된 논문은 0개 있음, 4번 이상 인용된 논문은 4개 있음 -> n번 이상 인용된 논문이 n개임 ( 같아지는 지점 )
5번 인용된 논문은 1개 있음, 5번 이상 인용된 논문은 3개 있음 -> 줄어드는 지점
6번 인용된 논문은 1개 있음, 6번 이상 인용된 논문은 2개 있음
7번 인용된 논문은 1개 있음, 6번 이상 인용된 논문은 1개 있음
나의 풀이 - 3번째 풀이 (정답)
def solution(citations):
answer = 0
n = len(citations)
citations.sort()
for i in range(len(citations)):
H_index = n - i
if citations[i] >= H_index:
answer = H_index
break
return answer
'coding test - python > Programmers' 카테고리의 다른 글
Programmers / 위장 / Python 파이썬 (0) | 2022.07.21 |
---|---|
Programmers / 다리를 지나는 트럭 / Python 파이썬 (0) | 2022.07.20 |
Programmers / 기능 개발 / Python 파이썬 (0) | 2022.06.30 |
Programmers / 큰 수 만들기 / Python 파이썬 (0) | 2022.06.30 |
Programmers / 124 나라의 숫자 / Python 파이썬 (0) | 2022.06.28 |