[알고리즘] H-Index

김민기·2022년 8월 24일
0

알고리즘

목록 보기
4/9

출처: 프로그래머스 코딩 테스트 연습

문제 요약

H-Index는 과학자의 생산성과 영향력을 나타내는 지표다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 한다.

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index가 된다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 구하라.

제한사항

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

입출력 예

citationsreturn
[3, 0, 6, 1, 5]3

이 과학자가 발표한 논문의 수는 5편이고, 그 중 3편의 논문은 3회 이상 인용되었다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3이다.

풀이과정

문제에 대한 설명과 예시가 너무 부족하다는 생각이 든다.. 질문하기에서도 다들 비슷한 얘기를 하고 있다. 위키 백과에서 설명은 보는게 차라리 나을 정도라고 말한다.

헷갈렸던 부분은 h가 반드시 논문의 인용 횟수 중 하나여야 한다고 생각했던 것인데, 만약 인용 횟수 배열이 다음과 같다면
[1, 1, 5, 7, 6] 1번 이상 인용된 논문의 수는 5개이고 5번 이상 인용된 논문의 수는 3개이기 때문에 5가 정답일 것이라 생각했고 h번 이상 인용된 논문, h번 이하 인용된 논문이라는 말 때문에 갯수를 구하는데 어려움이 있었다.

결국 문제를 완전히 이해하지 못하고 다른 사람의 코드를 참고해서 문제를 풀게 되었다. 스스로 풀지 못한점이 아쉽지만
풀이하는 코드는 매우 간단했다.

function solution(citations) {
  citations.sort((a,b) => b-a);
  let hIndex = 0;
  citations.map((a) => {
    if( a >= hIndex + 1) hIndex++;
  })
  return hIndex;
}

citations 배열을 내림차순으로 정렬한다. 가장 인용횟수가 많은 인덱스 부터 차례대로 hIndex를 구한다.

citations 배열을 map으로 순회하면서 hIndex+1 값보다 클 경우 hIndex를 증가시킨다. hIndex+1 보다 배열의 값이 작을 경우 더 이상 hIndex를 증가시키지 않는다.

map을 순회하고 나면 결과적으로 hIndex를 구할 수 있게 된다.

마무리

알고리즘 문제는 역시 문제 이해가 가장 중요한것 같다. 문제를 제대로 이해하지 못하니 시간을 너무 많이 소비했고 결국 스스로 풀지 못했다. 문제에 대한 설명이 부족하더라도 문제의 요점을 빠르게 파악할 수 있는 능력이 필요하다 생각된다.

0개의 댓글