본문 바로가기
알고리즘

H-Index

by limew 2023. 12. 8.

https://school.programmers.co.kr/learn/courses/30/lessons/42747#

 

 


 

 

발표논문 n개중, (h이상 인용된 논문이 h이상 + 나머지가 h이하)일때의 h

=> 즉 "h번 이상 인용된 논문이 h편 이상인 최대 h를 구하라" 가 문제의 요점인데 (아니 뭔 수수께끼나구요...)

설명과 예시 코드가 부족하고 표현이 애매해서 문제를 정확히 이해하지 못 했고 결국 다른 분의 해석을 보고 풀었다

 

 

핵심은 h의 최대값은 입력값 citations의 길이고,
인용된 횟수와 조건이 맞는 논문 갯수가 일치하는 최대값 구하기 문제이다

 

 

예를들어

citations = [ 9000,7000, 10000, 5000, 6000 ] 일때

 

1번 이상 인용된 논문 = 5편 >= 1편 이상

2번 이상 인용된 논문 = 5편 >= 2편 이상

3번 이상 인용된 논문 = 5편 >= 3편 이상

4번 이상 인용된 논문 = 5편 >= 4편 이상

5번 이상 인용된 논문 = 5편 >= 5편 이상

6번 이상 인용된 논문 = 5편 < 6편 미만

 

아무리 인용 횟수가 커도 h-index는 5이다

 

 

또한 문제에서 설명은 없었지만 내가 놓친 포인트들이다.

  • 각 논문의 인용된 수는 중복이 가능하다. (즉 citations 배열 안에 중복이 있을 수 있다)
  • answer은 citations의 값 외에도 될 수 있다. (나는 citations안 인용갯수만큼만 가능한 줄 알아서 [1,3] 이런 경우일때 h가 2인 경우를 빼먹었다.)

 

로직

  1. 먼저 h번 이상 인용된 논문의 갯수를 빨리 알기위해 citations를 오름차순으로 정리한다
  2. h는 0번부터 citations의 길이만큼 가능하므로 이를 순회한다
    1. 매번 h번 이상 인용된 논문의 갯수를 구하고 이것이 h번 이상이면 answer를 갱신한다.

 

function solution(citations) {
  let answer = 0;
  citations.sort((a, b) => a - b);

  for (let h = 0; h <= citations.length; ++h) {
    const count = citations.filter((c) => c >= h).length; // h이상인용된 눈문 갯수 구하기
    // h이상 갯수가 h이상이면 answer갱신
    if (count >= h) {
      answer = h;
    }
  }
  return answer;
}

 

 

filter로 h이상 인용된 논문 갯수 구하는 부분 최적화하기

while로 h미만까지의 인덱스를 구한 뒤 total논문 갯수에서 그 인덱스를 빼면 된다.

 

function solution(citations) {
  let answer = 0;
  citations.sort((a, b) => a - b);
  const total = citations.length;

  for (let h = 0; h <= citations.length; ++h) {
    let i = 0;
    // h미만까지 i옮기기
    while (h > citations[i]) {
      i++;
    }
    const count = total - i; // h이상 갯수
    if (count >= h) {
      answer = h;
    }
  }
  return answer;
}

 

 

 

'알고리즘' 카테고리의 다른 글

[카카오2020] 괄호 변환  (0) 2023.12.10
[카카오2018] [3차] 파일명 정렬  (0) 2023.12.09
[프로그래머스 lv2] 숫자 카드 나누기  (0) 2023.12.08
줄 서는 방법  (0) 2023.12.08
롤케이크 자르기  (0) 2023.12.07