프론트엔드 개발/Algorithm

프로그래머스 lv2. H-Index

하이고니 2023. 2. 12. 13:44

문제 설명

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

어떤 과학자가 발표한 논문 n편 중, 

h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 

h의 최댓값이 이 과학자의 H-Index입니다.

 

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때,

이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

 

입출력 예
[3, 0, 6, 1, 5] 3
 
입출력 예 설명

이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.

 
문제가 잘 안풀린다면😢

힌트가 필요한가요? [코딩테스트 연습 힌트 모음집]으로 오세요! → 클릭

※ 공지 - 2019년 2월 28일 테스트 케이스가 추가되었습니다.

 

 

완전 처음에는 arr을 오름차순 sorting해서 

내 자신의 숫자가 n 이라면 내 뒤에 n-1 개 이상 있으면 h를 나 자신으로 바꾼다. 라는 식으로 접근했다.

그런데 [3, 7, 7, 7, 7] 의 경우 아예 배열에 없는 숫자 4가 리턴되야 하므로, 전략을 수정했다.

 

function solution(arr) {
    
    const max = Math.max.apply(null, arr);
    
    let h = 0;
    let count = 0;
    let i = 1;
    
    while ( i <= max ) {
      for (let j = 0; j <= arr.length; j++){
          if (i <= arr[j]) {
              count++;
          }
      }
      if (count > h) h = i;
      count = 0;
      i++;
    };
    
    return h;
}

 

i부터 배열의 요소를 쫙 돌면서 i보다 크거나 같은 요소가 있을 때 count를 증가시켜준다.

count가 h보다 클 경우 h에 i를 할당한다.

 

이런 식으로 쭉 돌면 [3, 7, 7, 7, 7] 에서 h에 4까지 할당될 수 있고 조건을 만족시킬 수 있다.

 

 

*** 처음에는

const min = Math.min.apply(null, arr);

위 코드를 max 다음 줄에 써서,

min 부터만 탐색하면 된다고 생각했다. 어차피 최솟값이 그 밑으로 떨어질 리는 없으니..

 

근데 [10, 10, 10, 10, 10] 의 경우,

최솟값이 10으로 할당되어, H-Index 가 10이 나와버리게 된다.

 

그래서 1부터 탐색하는 걸로 바꿨다.

'프론트엔드 개발 > Algorithm' 카테고리의 다른 글

javascript bubble sort  (0) 2023.02.16
재귀 연습문제  (0) 2023.02.14
Big-O 표기법  (0) 2023.02.12
프로그래머스 lv2. 점프와 순간 이동  (0) 2023.02.04
프로그래머스 lv2. 카펫  (0) 2023.01.30