어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index이다. 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
문제를 이해하기가 어려웠다... filter를 사용해 풀려고 했는데, 문제를 너무 복잡하게 돌아가는 느낌이 강하게 들었다.
/* 틀린 풀이 */
function solution(citations) {
citations.sort((a,b) => a-b);
let answer=Number.MIN_SAFE_INTEGER;
for (let i=0; i<citations.length; i++) {
let abv = citations.filter(a => a >= citations[i])
if (abv.length >= citations[i]) {
let tmp = abv.slice(0, citations[i]);
let bel = citations.filter(a => !tmp.includes(a));
let jud = true;
for (let j=0; j<bel.length; j++) {
if (bel[j] > citations[i]) jud=false;
}
if (jud==true) {
answer = Math.max(answer, citations[i]);
}
}
}
return answer;
}
console.log(solution([3,0,6,1,5]));
H-지수 구하는 법
- 논문이 많이 인용된 순으로 정렬 후,
- 피인용수가 논문 수와 같아지거나 작아지는 시점에 index 반환
- 아니라면 길이 전체를 반환
H-지수란 무엇인가?
h번 이상 인용된 논문이 h편 이상일 때이므로
논문을 오름차순 정렬 후 h번 이상 인용된 게 h번째인 순간을 찾아내기
정렬 후 요소와 인덱스 간 관계를 생각해보면 쉽게 풀 수 있었던 문제였다.
function solution(citations) {
citations.sort((a,b) => b-a);
for (let i=0; i < citations.length; i++) {
// console.log(citations[i], i);
if (citations[i] <= i) {
return i;
}
}
return citations.length;
}
console.log(solution([3,0,6,1,5]));