본문 바로가기

알고리즘 문제풀이

[프로그래머스] 고득점 키트 - 정렬3

오늘 푼 문제

 

 

3. H-Index / Lv.2 / 시간 : 52분 (타임 오버) 

programmers.co.kr/learn/courses/30/lessons/42747?language=javascript

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

function solution(citations) {
    var answer = 0;
    let arr = citations.sort((a,b) => a-b);
    let n = citations.length;
    
    if(arr[0] > n) return n; 
    
    let pos = n-1;
    
    while(arr[pos] > n-pos){
        pos--
    }
    
    let temp = arr[pos];
    let left = n-pos;
    
    while(temp<left-1){
        temp++
    }
    answer = temp

    return answer;
}

 

헤맸던 부분

1. 정답 h는 citations 배열의 원소 값이 아니어도 된다. 

2. 최소 인용 횟수가 논문 전체의 편수보다 크다면 h는 논문 전체 편수가 된다.

 

 

다른 사람의 풀이

function solution(citations) {
    var answer = 0;

    citations.sort((a, b) => b - a);

    for(let i = 0; i < citations.length; i++) {
        if(citations[i] > i) answer++;
        else break;
    }

    return answer;
}

 

내림차순 정렬 후 해당 배열의 인덱스보다 배열의 값(인용 횟수)이 더 큰 경우를 모두 카운트하면 정답이 나온다.

왜지? 이해 못 함

 


 

유레카!

h-index의 이해를 돕기 위한 추가 설명 참조

www.ibric.org/myboard/read.php?Board=news&id=270333

 

[연구논문을 위한 핵심 10단계] H-지수(H-Index) 란 무엇인가?

일반적으로 특정 연구원의 연구성과를 평가하기 위해 얼마나 많은 논문을 발표 하였는지를 보게됩니다. 그러나 단순히 발표한 논문 수로만 그 연구원의 연구 업적을 평가 하기에는 발표한 논문

www.ibric.org

해당 글을 보면 h-지수를 구하는 방법을 다음과 같이 설명한다. 

자신이 저널에 등재한 전체 논문중 많이 인용된 순으로 정렬한 후, 피인용수가 논문수와 같아지거나 피인용수가 논문수보다 작아지기 시작하는 숫자가 바로 나의 h가 됩니다.

즉, 내림차순으로 정렬한 다음 배열을 살펴보면

인덱스 i 와 값 h는 곧

'h번 이상 인용된 논문의 편수가 (i+1)편'

임을 의미한다.

 

ex) [33,12,5,3] 으로 정렬된 배열에서

33번 이상 인용된 논문은 [33], 총 1편 ( i+1= 0+1 = 1),

12번 이상 인용된 논문은 [33, 12], 총 2편 ( i+1= 1+1 = 2),

5번 이상 인용된 논문은 [33, 12, 5], 총 3편 ( i+1= 2+1 = 3),

3번 이상 인용된 논문은 [33, 12, 5, 3], 총 4편 ( i+1= 3+1 = 4)

 

따라서 인용횟수 h가 논문편수 i를 넘지 않는 범위 내에서의 i를 하나씩 증가시켜 가면서 값을 비교하면 h의 최댓값을 구할 수 있다.