[정렬] H-index

yerin6860·2020년 8월 12일
0

프로그래머스

목록 보기
14/30
post-thumbnail

|| 문제설명 ||

  1. 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index이다.
  2. 과학자의 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;
}

0개의 댓글