[프로그래머스] H-Index

재오·2023년 5월 26일
1

코딩테스트

목록 보기
29/46
post-thumbnail

🗒️ 문제

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

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

⚠ 제한사항

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

📝 문제 해설

아주 간단한 문제로 보였다. 핵심적인 단어는 h번 이상 인용된 논문이 h편 이상이다. 이하는 신경쓸 필요가 없다. 우선 배열을 오름차순으로 정렬해 주었다. 예제를 보면 [3,0,6,1,5] 배열이 있었는데 이를 오름차순으로 정렬해주면 [0,1,3,5,6]이 된다. 처음에는 0번 이상 인용된 것이 0번 이상(5회)이기 때문에 성립하고, 1번 이상 인용된 것이 1번 이상(4회) 때문에 성립하고, 3번 이상 인용된 것이 3번 이상(3회) 성립하고, 하지만 5번 이상 인용된 것은 5번 이상이 아니기 때문에 성립을 하지 않아서 H-Index는 3 이렇게 풀었다. 테스트케이스에서는 정답이었으나 최종 제출에서 정답률 6%가 나왔다.

뭐가 문제였는지 생각해보니까 굳이 배열 안에 있는 원소만 해당되는 것이 아니었다. 저 배열을 가정하면 2도 성립될 수 있고, 4도 성립 요건이 가능하다. 운이 좋게 3이 배열에 원소로 들어있어서 성립이 된 것이다. 따라서 배열의 가장 큰 값을 기준으로 모든 원소를 다 체크 해봐야 한다.
따라서 이중 for문을 사용하여 하나는 0부터6까지의 원소를 체크하고, 다른 for문은 해당 원소값과 비교해서 큰 값이 배열에 몇개가 있는지를 체크해주면 된다.

💻 코드

function solution(citations) {
    citations = citations.sort((a,b) => a-b);
    let max = 0; // max는 비교할 때에만 쓰인다
    let k; // 결과값을 k에 담는다
    
  // 0부터 끝에 원소값까지 순차적으로 모두 비교
    for(let i=0; i<=citations[citations.length-1]; i++){
      // 배열 안에 있는 값과 i값을 비교하면서 max에 성립 개수를 담아준다.
        for(let j=0; j<citations.length; j++){
            if(i <= citations[j]){
                max = citations.length - j;
                if(max >= i) k = i;
                break;
            }
        }
    }
    return k;    
}
profile
블로그 이전했습니다

0개의 댓글