문제 설명
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회 이하입니다.
입출력 예
citations | return |
[3, 0, 6, 1, 5] | 3 |
코드 작성
성공 #1
def solution(citations):
citations.sort()
if citations[-1] == 0:
return 0
for i in range(len(citations)):
min = citations[i]
if min < len(citations[i:]):
pass
else:
if min > len(citations[i:]):
return len(citations[i:])
else:
return min
사실 이거 전에 엄청나게 틀렸는데 실패 코드를 가져오는 것을 깜빡했다.
- 우선 citations를 오름차순으로 정렬
- citations의 마지막 원소가 0이면 굳이 코드를 실행할 필요가 없으므로 0을 리턴한다.
- for문을 이용하여 0부터 citations의 마지막 원소까지 훑어보려고 했다.
- min에 citations[i]를 대입하고 if문을 진행한다.
- 1번 if 문: 만약 citations의 남은 원소의 길이가 min보다 큰 경우는 계속 다음 원소로 넘어가도 상관없다.
- 1번 else 문: 만약 citations의 남은 원소의 길이가 min보다 작은 경우 다음 원소로 넘어가면 안된다.
- 2번 if 문: 만약 min값(현재 가리키고 있는 citations값)이 남은 원소의 개수보다 큰 경우에는 남은 citations의 값을 리턴한다.
- 2번 else문: 만약 같은 경우에는 min을 리턴한다.
다른 사람 코드
def solution(citations):
citations.sort(reverse=True)
answer = max(map(min, enumerate(citations, start=1)))
return answer
- citations를 내림차순으로 정렬한다.
- enumerate() 함수는 인덱스와 원소로 이루어진 tuple을 만들어준다. 여기서는 start를 1로 두어 citations는 1로 인덱스가 시작되었다. 예를 들어 citations = [3, 2, 1] 이면 enumerate(citations, start=1)은 (1, 3), (2, 2), (3, 1)을 결과로 반환한다. 결국 마지막까지 부여된 인덱스의 값은 citations의 길이와 동일하다. 3이상 인용된 논문은 1개, 2이상 인용된 논문은 2개, 1이상 인용된 논문은 3개 이런 식으로 인덱스가 부여된 것이다.
- map 함수를 이용하여 해당 결과에 min 함수를 씌운다. 그러면 enumerate의 결과 튜플에서 최소값만 걸려져 나오게 된다.
- 위 예시에서 (3, 1)은 1이 반환, (2, 2)는 2가 반환, (3, 1)은 1이 반환된다. 이 반환된 값들은 모두 h-index로 사용할 수 있는 값들이다. 이 중에서 가장 큰 수를 골라야 하므로 마지막으로 max함수를 취한다.
끝으로
이번 문제는 이해하기가 힘들어서 진짜 머리를 아프게 했다.
테스트케이스도 1개밖에 없어서 내가 직접 추가해서 진행해야 했다.
역시나 코딩을 잘하는 사람은 널리고 널렸다. 다른사람의 풀이를 보면 내 풀이는 되게 초라해진다.