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};
- 내림차순 정렬 → {6, 5, 3, 1, 0}
- 각 인덱스별 비교
- 6 >= 1 → 조건 충족
- 5 >= 2 → 조건 충족
- 3 >= 3 → 조건 충족
- 1 < 4 → 조건 불충족 → H-Index = 3
결론
이 코드는 O(n log n)의 시간 복잡도를 가집니다.
- 정렬: O(n log n)
- 반복문: O(n)
'코딩 테스트 > 알고리즘' 카테고리의 다른 글
알고리즘 87번 - js (0) | 2025.04.11 |
---|---|
알고리즘 85번 - 연속 부분 수열 합의 개수 (0) | 2025.03.04 |
알고리즘 84-괄호 회전하기 (0) | 2025.02.28 |
알고리즘 83 -귤 고르기 (0) | 2025.02.25 |
알고리즘 82번 멀리뛰기 (0) | 2025.02.24 |