본문 바로가기
코딩 테스트/알고리즘

86번 - H-Index js

by GREEN나무 2025. 3. 23.
728x90

URL : 

문제

더보기

문제 설명
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
입출력 예 설명
이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

계획

  • 내림차순 정렬
    논문을 인용 횟수가 많은 순서로 정렬합니다.
  • H-Index 찾기
    • 인덱스를 기준으로 현재 논문이 i + 1번 이상 인용되었는지를 확인합니다.
    • 조건: citations[i] >= i + 1
    • 조건을 만족하면 h = i + 1로 업데이트합니다.

 


 

JS

 

function solution(citations) {
    // 1. 내림차순 정렬
    citations.sort((a, b) => b - a);
    let h = 0;

    // 2. H-Index 찾기
    for (let i = 0; i < citations.length; i++) {
        if (citations[i] >= i + 1) {
            h = i + 1;
        } else {
            break;
        }
    }
    return h;
}

console.log(solution([3, 0, 6, 1, 5])); // 출력: 3

코드 간략화하기

const solution = c => (c.sort((a, b) => b - a), c.findIndex((x, i) => x < i + 1) || c.length);

다른사람 답

function solution(citations) {
    let i = 0;

    while(i + 1 <= citations.sort((a, b) => b - a)[i]) i++;

    return i;
}

 

◆ C++

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

using namespace std;

int solution(vector<int> citations) {
    // 1. 내림차순 정렬
    sort(citations.begin(), citations.end(), greater<int>());
    int h = 0;

    // 2. H-Index 찾기
    for (int i = 0; i < citations.size(); i++) {
        if (citations[i] >= i + 1) {
            h = i + 1;
        } else {
            break;
        }
    }
    return h;
}

int main() {
    vector<int> citations = {3, 0, 6, 1, 5};
    cout << "H-Index: " << solution(citations) << endl; // 출력: 3
    return 0;
}

 

코드 간략화하기

#include <vector>
#include <algorithm>
int solution(std::vector<int> c) {
    std::sort(c.rbegin(), c.rend());
    for (int i = 0; i < c.size(); i++) if (c[i] < i + 1) return i;
    return c.size();
}

다른사람 답

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

using namespace std;

int solution(vector<int> citations) {
    sort(citations.begin(), citations.end(), greater<int>());

    for (int i = 0; i < citations.size(); ++i) {
        if (citations[i] < i + 1) {
            return i;
        }
    }

    return citations.size();
}

이 코드는 H-Index를 계산하는 함수 solution입니다. H-Index는 연구자가 발표한 논문 중에서 h번 이상 인용된 논문이 h편 이상이고, 나머지 논문이 h번 이하 인용되었을 때의 최댓값을 의미합니다.

코드 분석

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
  • string, vector는 기본적인 C++ STL 라이브러리입니다.
  • algorithm 헤더는 sort() 함수 사용을 위해 포함했습니다.

함수 설명

int solution(vector<int> citations) {
    sort(citations.begin(), citations.end(), greater<int>());
  • sort() 함수는 논문의 인용 횟수를 내림차순으로 정렬합니다.
  • greater<int>()는 내림차순 정렬을 의미합니다.

    for (int i = 0; i < citations.size(); ++i) {
        if (citations[i] < i + 1) {
            return i;
        }
    }
  • 반복문: 각 논문의 인용 횟수를 확인하면서 조건을 만족하는지 검사합니다.
  • citations[i] < i + 1는 i+1편 이상의 논문이 i+1회 이상 인용되지 않았을 경우를 의미합니다.
  • 해당 조건이 참이면 현재 i가 H-Index가 됩니다.

    return citations.size();
}
  • 만약 모든 논문이 조건을 만족하면 논문의 개수가 H-Index가 됩니다.

예시

vector<int> citations = {3, 0, 6, 1, 5};
  1. 내림차순 정렬 → {6, 5, 3, 1, 0}
  2. 각 인덱스별 비교
    • 6 >= 1 → 조건 충족
    • 5 >= 2 → 조건 충족
    • 3 >= 3 → 조건 충족
    • 1 < 4 → 조건 불충족 → H-Index = 3

결론

이 코드는 O(n log n)의 시간 복잡도를 가집니다.

  • 정렬: O(n log n)
  • 반복문: O(n)