본문 바로가기
코테준비/하루한개도전~

99클럽 코테 스터디 4일차 TIL : 정렬 - H-index

by 움바둠바 2024. 5. 27.
728x90

와진짜

너무어려웠다,,,,,,,

난정말똥멍청이야

 

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

 

즉 h이상 인용된 논문이 h편 "이상" 일 때 hindex가 정해진다!

뭔가 더 좋은방법이 있을것같긴한데

나는 그냥 전부다 탐색하면서 해결했다 (냅다 반복문사용)

그래도 반복문이 전부다 한단계씩만 있어서,,, 이중반복문은 아니라 다행이다.

 


1. 배열 citations를 정렬한다 (나는 오름차순으로 정렬했다)

2. hindex의 최대값은 citations의 길이이다 (== 과학자가 발표한 논문의 개수)

3. 배열의 index는, 제일 오른쪽부터 시작! (즉 size-1, 인용수가 가장 큰것부터 확인하려는것)

4. citations[index] > hindex의 경우, 해당 인용수가 hindex가 될 수 없으므로 해당경우에는 index를 하나씩 줄여준다.

-> 지금까지의 상황은

이런느낌이 된다!!

(혹은 h-index == citations[index])인 상황이 된다.

 

 

 

 

 

 

 

 

4-a. 만약, index가 0이 될때까지 citations[index] > hindex인경우, 

        인용횟수의 최소값이 전체 논문개수보다 많은상황이다

        즉 그냥 hindex가 전체 논문개수이므로 여기서 hindex가 정해진다.

5. hindex >= citations[index]인 상황에서 반복문을 돈다.

    a. 지금 상황을 기준으로 논문횟수가 hindex 이상인 논문개수를 구한다 (larger)

    b. larger가 hindex "이상"인 경우, hindex가 정해진것이므로, 반복을 멈춘다

    c. 아닌경우, hindex를 1줄인다 (hindex 최대값부터 시작이므로)

        이때! h-index가 citations[index]보다 작아지면, index로 1줄여준다.

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int solution(vector<int> citations) {
    int answer = 0;
    sort(citations.begin(), citations.end());
    // 오름차순 정렬
    
    //cout << citations[0] << endl;
    
    bool flag = true;
    int allsize = citations.size();
    int index = allsize-1; // 제일 인용수가 많은 논문의 index 
    int hindex = allsize; // hindex의 최대값 (논문 개수)
    
    //cout << allsize << endl;
    //cout << hindex << endl;
    
    // 논문수가 allsize편이므로 hindex는 촤대 allsize임
    // 즉 제일 끝에있는 논문의 인용수가 allsize을 초과하면, allsize이하인 index부터 시작하는게 맞음
    while(hindex < citations[index]){
        if(index < 0){
            // 이하로 내려가는 경우
            return hindex;
            break;
        }
        index--;
    }
    
    
    // 중복된 개수 (1,1,1,1,1,1....) 가 있을 때 중간에 멈추는 상황을 방지할필요가 있어보임
    // 시작상황
    // hindex >= citations[index]
    cout << index << endl;
    while(flag){
        
        int larger = allsize - index;
        if(citations[index] != hindex){
            larger -=1;
        }
        //cout << "allsze, index, larger "<<allsize <<", "<<index << " , "<< larger << endl;
        if(larger >= hindex){
            flag = false;
            break;
        }else{
            hindex--;
            if(hindex > citations[index-1] && hindex <= citations[index]){
                index--;
            }
        }
        
        
    }
    
    answer = hindex;
    
    
    return answer;
}

 


뭔가 다른사람 코드를 보면 좀 더 단순하고 간단하게 해결한것같은데

생각하기 귀찮으니까 그냥 넘겨야겠다,,,,

챌린저문제도,,,,

일요일은넘힘들어서 스터디고뭐고 귀찮다,,

암튼

해결됐으니까 된거겠지모..

728x90