• (자바스크립트 알고리즘) H-Index - kimyang-sun

    2020. 11. 29.

    by. kimyang-Sun

    자바스크립트 알고리즘 (Programmers)


    문제 설명

    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회 이하입니다.

    입출력 예


    문제 풀이

    function solution(citations) {
      let answer = 0;
      citations.sort((a, b) => b - a);
      for (let i = 1; i <= citations.length; i++) {
        if (i === citations[i - 1]) {
          answer = i;
          break;
        } else if (i > citations[i - 1]) {
          answer = i - 1;
          break;
        }
        answer = citations.length;
      }
      return answer;
    }

    풀이입니다.

     

    문제를 이해하기까지 시간이 좀 걸렸습니다.

     

    우선 입출력 예시에서처럼 [3, 0, 6, 1, 5] 총 5개의 논문이 있고 각각 논문의 값들은 인용된 횟수입니다.

     

    1번 이상 인용된 논문은 [3, 6, 1, 5] 이렇게 4개이고,

    2번 이상 인용된 논문은 [3, 6, 5]  3개,

    3번 이상 인용된 논문은 [3, 6, 5]  3개,

    4번 이상 인용된 논문은 [6, 5]  2개,

    5번 이상 인용된 논문은 [6, 5]  2개,

    6번 이상 인용된 논문은 [6]  1개입니다.

     

    논문 n편 중, h번 이상 인용된 논문이 h편 이상이이 되는 h의 최댓값이기 때문에 이 예시에서는

    4편 이상으로 인용된 논문이 4개가 안되기 때문에 3편 이상으로 인용된 논문 3개가 최댓값이기 때문에

    답은 3이 됩니다.

     

    처음에는 반복문으로 배열을 하나하나 만들어주고 index와 배열의 length가 같은값을 찾고 나머지

    경우에 따라서 하나하나 맞춰서 답을 냈었는데 기능적으로 시간이 좀 오래 걸려서 그 방법이 아닌

    다른 방법으로 했습니다.

     

    sort를 이용해 내림차순으로 정렬하고 반복문으로 1부터 배열의 length까지 반복해줍니다.

    반복할때는 index 즉 인용된 논문수가 citations[i - 1] 배열의 처음값부터 순서대로 돌면서 비교합니다.

     

    두값이 같을때 그대로 그 값을 리턴해주면 되고 보통은 여기서 끝이납니다.

     

    하지만 예외의 인자배열이 존재할수도 있는데 바로 [13, 14, 15, 16] 이렇게 i 값과 citations[i - 1] 값이

    같아질 수가 없는 상황이 생깁니다. i 값은 4가 최대인데 citations[i - 1] 값은 가장 작은수도 13이기 때문입니다.

     

    이 경우에는 h값이 논문들의 수인 4가 되어야하기 때문에 그대로 citations.length 값을 리턴해주면 됩니다.

     

    또 다른 경우는 else if 를 통해 추가하였는데 이 경우는 [0, 0, 0] 이런식으로 모든 배열이 0일 경우입니다.

     

    i 가 citations[i - 1]보다 큰 경우로서 answer에는 i - 1 을 해준 0을 리턴해주면 됩니다.

     

    다른 사람들의 풀이

    function solution(citations) {
         citations = citations.sort(sorting);
         var i = 0;
         while(i + 1 <= citations[i]){
             i++;
         }
         return i;
    
         function sorting(a, b){
             return b - a;
         }
    }
    

    댓글