주어진 array는 각각의 논문이 얼만큼 언급되어있는지 알려주고 있다. 이때 h편 이상 언급된 논문이 h편이상일때 h를 h-index라고 한다. 이때 h-index의 최대값을 구하라.
예를 들어서 array = [0,3,1,5,6]
일때 h-index는 3이다. 5는 안된다 왜냐면 5편이상 언급된 논문이 2개밖에 없기 때문이다.
h를 0부터 하나씩 증가시키면서 citations의 index로 설정한다. h편이상 언급된 논문(citations[h]
)이 h와 같으면 answer에 담고 h이상이면 h를 늘리고 이하이면 break해서 빠져나간다. 만약 위와 같은 arr가 주어졌을때 진행과정은 아래와 같다.
// h above
// 0 => 5
// 1 => 4
// 2 => 3
// 3 => 3
// 4 => 2
function solution(citations) {
let answer = 0;
let hInd = 0;
let above = 0;
// citations.sort((a,b)=>a-b)
while (true) {
for (let i = 0; i < citations.length; i++) {
if (citations[hInd] >= citations[i]) above++;
}
if (citations[hInd] > above) break;
else if (citations[hInd] < above) {
hInd++;
above = 0;
} else {
answer = citations[hInd];
}
}
return answer;
}
코드에 문제는 없는데 테스트케이스도 통과했는데 최종 점검에서 다 떨어졌다 ㅋㅋㅋㅋㅋ 그래서 다른 사람들 코드를 살펴보았다.
function otherSOlution(citations) {
let sortedcitations = sort((a, b) => b - a);
while (i + 1 <= citations[i]) {
i++;
}
return i;
}
무엇을 의미하는 것일까? 일단 citations을 내림차순 정렬한다. 그런 다음 가장 많이 언급된 논문을 필두로 점점 오른쪽으로 가면서 덜 언급된 논문으로 이동한다.
그럼 i+1
이 이때까지 내가 살펴본 논문의 갯수이다. 그리고 citations[i]
는 내가 지금 살펴보고있는 논문의 언급된 수이다. 그래서 내가 살펴본 논문의 갯수가 내가지금 살펴보고있는 논문의 언급된 수보다 크거나 같으면 빠져나온다.
그래서 3+1 / citations[3]
일때는 빠져나오게 되는 것이다.
지금 보고있는 논문의 언급된 수가 1밖에 안되는데 내가 지금 검토한 논문은 4편이나 되기 때문이다. 그래서 i(3편) 는 3까지가 최대라서 i은 3이 되는 것이다.
즉 h-index는 i가 되는 것이다.
그 뒤로 가면 ciatations[i]
는 더 적어질 뿐이고 h-index는 더 커질 뿐이라서 의미없다.
아직 까지 직관적으로 이해는 안된다. 나중에 더 보면 되겠지. 오케이 끝!
그리고 내 코드의 문제점도 나중에 고쳐보자!