[Lv2] H-index

Creating the dots·2022년 1월 12일
0

Algorithm

목록 보기
49/65
post-custom-banner

프로그래머스

시도(1) ❌

  • 너무 단순하게 citations를 오름차순 정렬해 중간값을 리턴했다.
  • 인용횟수 이상의 논문이 있어야하는데, 그 점을 고려하지 못했다.
function solution(citations) {
    citations.sort((a,b)=>a-b); //오름차순 정렬
    const len = citations.length;
    if(len%2===1) return citations[Math.floor(len/2)]
    return citations[len/2];
}

시도(2) ❌

  • 두번째 풀이는 동일한 논문인용 횟수를 가진 논문들이 있을 수 있음과, 인용횟수 이상의 논문 개수도 고려해서 코드를 작성해보았다.
  • 그런데 테스트케이스 9번16번이 통과하지 않았다.
function solution(citations) {
    citations.sort((a,b) => a-b); //오름차순 정렬
    const len = citations.length; //전체 논문 개수
    let H = 0; //h번 인용된 논문 개수 
    
    for(let i=0; i<len; i++){
        //인용 횟수가 같은 논문은 넘어가기
        if(citations[i] === citations[i-1]) continue
        if(citations[i] > len-i) break; // 인용횟수가 더 큰 경우 
        H = citations[i];
    }
    return H;
}


function solution(citations) {
    citations.sort((a,b) => a-b); //오름차순 정렬
    const len = citations.length; //전체 논문 개수
    let cnt = 0; //h번 인용된 논문 개수 
    
    for(let i=0; i<=Math.floor(len/2); i++){
        //인용 횟수가 같은 논문은 넘어가기
        if(citations[i]===citations[i-1]) continue
        if(citations[i] > len-i) break;
        cnt = len-i-1;
    }
    return cnt;
}

다른 분의 풀이

  • 내림차순으로 정렬한다.
    • 인용횟수가 많은 논문부터 정렬하여 최대 인용횟수를 빠르게 찾을 수 있도록 한다.
  • idx는 논문 인용횟수이면서 idx 이상 인용된 논문의 (최소) 개수를 카운트한다.
    • idx는 1부터 시작한다.
    • citations는 내림차순 정렬되어있으므로, 예를들어, 1번째 인덱스 요소가 2회(idx=2) 이상 인용되었다는 것은 0번째 인덱스 요소(citation[idx-1])는 무조건 2회(idx=2) 이상 인용되었음을 뜻한다. 즉, idx-1번째 요소가 idx번 이상 인용되었다는 것은, idx-2번째 요소도 idx번 이상 인용되었다는 것이다. 따라서, n회이상 인용된 논문이 n개 이상일때, n의 최대값이 H-index이므로 idx의 최대값을 구하면 된다.
function solution(citations) {
  citations.sort((a,b) => b-a); //내림차순 정렬
  let idx = 1;
  while(idx <= citations[idx-1]) {
    idx++;
  }
  return idx-1;
}
profile
어제보다 나은 오늘을 만드는 중
post-custom-banner

0개의 댓글