|| 문제설명 ||
- 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index이다.
- 과학자의 H-Index를 return 하도록 solution 함수를 작성하라.
- citations : 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열
_ 과학자가 발표한 논문의 수 : 1편 이상 1,000편 이하
_ 논문별 인용 횟수 : 0회 이상 10,000회 이하
|| 문제해결과정 ||
- citations를 정렬한 뒤 논문 개수의 반보다 같거나 작은 경우 들 중에서 가장 큰수 고르기
|| 코드 ||
[2020.08.12] 실패
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> citations) {
int answer = 0;
sort(citations.begin(), citations.end());
int max = (citations.size()+ 1)/2;
for(int i= 0; i< max; i++) {
if( citations[i] <= max) answer = citations[i];
else return answer;
}
}
- 예외처리 : citations의 원소가 아닐 경우 + 모든 논문의 인용 횟수가 논문의 갯수보다 많을때
[12,11,10,9,8,1] => 5 / [4,4,4] => 3
[2020.08.13] 실패
- citations의 원소가 아닐 경우
if의 반대인 else에서 찾을 수 있는 경우로
원소가 아니라 남은 개수와 같고 기존의 answer보다 클경우만 해당된다.
전자의 경우 최댓값을 구해야하니 break 해준다.
- 모든 논문의 인용 횟수가 논문의 갯수보다 많은 경우
answer == 0 일 때이므로 if문을 통해 citations의 size를 return해준다.
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> citations) {
int answer = 0;
sort(citations.begin(), citations.end());
for(int i= 0; i< citations.size(); i++) {
if( citations[i] <= citations.size()-i) {
answer = citations[i];
}
else {
if(citations.size()-i > answer) answer = citations.size()-i;
break;
}
}
if(!answer) answer = citations.size();
return answer;
}
- 예외처리 : 애초에 입력 자체가 [0, 0, 0]일 경우 return == 0 이여야 하기 때문에 추가적으로 확인작업을 해야한다.
[2020.08.13] 성공
- chk를 추가하여 if문을 통과했는지 안했는지 판단하여 원소에 0이 있을경우를 생각
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> citations) {
int answer = 0, chk = 0;
sort(citations.begin(), citations.end());
for(int i= 0; i< citations.size(); i++) {
if( citations[i] <= citations.size()-i) {
answer = citations[i];
chk = 1;
}
else {
if(citations.size()-i > answer) answer = citations.size()-i;
break;
}
}
if(!answer && !chk) answer = citations.size();
return answer;
}