[프로그래머스 lev2/JS] H-Index

woolee의 기록보관소·2022년 10월 24일
0

알고리즘 문제풀이

목록 보기
16/178

문제 출처

프로그래머스 lev2 - H-Index

문제 요약

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index이다. 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

나의 풀이

문제를 이해하기가 어려웠다... filter를 사용해 풀려고 했는데, 문제를 너무 복잡하게 돌아가는 느낌이 강하게 들었다.

/* 틀린 풀이 */
function solution(citations) {
  citations.sort((a,b) => a-b);
  let answer=Number.MIN_SAFE_INTEGER;
  for (let i=0; i<citations.length; i++) {
    let abv = citations.filter(a => a >= citations[i])

    if (abv.length >= citations[i]) {
      let tmp = abv.slice(0, citations[i]);
      let bel = citations.filter(a => !tmp.includes(a));
      let jud = true;

      for (let j=0; j<bel.length; j++) {
        if (bel[j] > citations[i]) jud=false;
      }

      if (jud==true) {
        answer = Math.max(answer, citations[i]);
      }
    }
  }
  return answer;
}

console.log(solution([3,0,6,1,5]));

다른 풀이(통과 코드)

H-지수 구하는 법

  1. 논문이 많이 인용된 순으로 정렬 후,
  2. 피인용수가 논문 수와 같아지거나 작아지는 시점에 index 반환
  3. 아니라면 길이 전체를 반환
    H-지수란 무엇인가?

h번 이상 인용된 논문이 h편 이상일 때이므로
논문을 오름차순 정렬 후 h번 이상 인용된 게 h번째인 순간을 찾아내기

정렬 후 요소와 인덱스 간 관계를 생각해보면 쉽게 풀 수 있었던 문제였다.

function solution(citations) {
  citations.sort((a,b) => b-a);
  for (let i=0; i < citations.length; i++) {
    // console.log(citations[i], i);
      if (citations[i] <= i) {
        return i;
      }
  }
  return citations.length;
}

console.log(solution([3,0,6,1,5]));
profile
https://medium.com/@wooleejaan

0개의 댓글