문제 설명
H-Index
는 과학자의 생산성과 영향력을 나타내는 지표
입니다. 어느 과학자의 H-Index를 나타내는 값인 h
를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편
중, h번 이상 인용된 논문
이 h편 이상
이고 나머지 논문이 h번 이하 인용
되었다면 h의 최댓값
이 이 과학자의 H-Index
입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
제한사항
입출력 예
입출력 예 설명
이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.
우선 문제를 이해하기가 쫌 어려웠다.
1. h의 최대값은 주어진 배열의 길이가 될 수도 있다는 것을 우선 생각했다.
2. 이 h의 값을 하나씩 줄여가면서, 현재 원소가 h의 값보다 크면 그 때의 h를 answer로 저장했다.
3. 만약 2번 과정에 해당되어 answer를 구했다면, 그 뒤의 원소들은 생각해볼 필요가 없다. 왜냐하면, h의 값이 점점 작아지기 때문에, 정답에는 영향을 미치지 않기 때문이다.
주의 할 점
예를들어,
[0, 2, 5, 6, 7]
로 배열이 주어질 때,h의 후보를 0, 2, 5, 6, 7
로 정하면,정답은 2회이상
인용된 논문이2편 이상
인2가 나올 것
이다.
하지만,h=3
이 될 수도 있다. 그래서 test케이스는 통과할 수 있을지 몰라도 채점에서는 다 틀리게 된다.
그렇기 때문에, h의 값
을 주어진 배열의 최댓값
에서 하나씩 줄여가며
현재 원소와 확인하는 것이 중요하다.
import java.util.*;
class Solution {
ArrayList<Integer> list = new ArrayList<>();
int cnt=0;
public int solution(int[] citations) {
int answer = 0;
for(int a : citations){
list.add(a);
}
Collections.sort(list);
//h의 최댓값은 하나이다. 그러므로 h의 최댓값은 list의 전체길이가 될 수 도 있는데, 앞에서 부터 원소를 탐색하며, 자기 자신을 포함한 현재 남은 논문의 개수 (h가 될 수 있는 값.) 보다 현재 원소가 크면. 남은 논문의 개수 (h)가 최댓값이 된다. h값은 가면 갈수록 작아지기때문에, 그 뒤는 볼 필요가 없다.
for(int i=0;i<list.size();i++){
int nums = list.size()-i;
if(list.get(i)>=nums){
answer = nums;
break;
}
}
return answer;
}
}