Coding test

[프로그래머스] H-index (Lv 2) - javascript

Jiwoo 2022. 5. 13. 23:23

문제

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회 이하입니다.
       

나의 풀이

function solution(citations) {

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

    for (let i = 0; i < citations.length; i++) {
        let citation = citations[i];
        if(citations.filter(v => v >= citation).length >= citation) {
            answer = citation;
            break;
        }
    }
    return answer;
}

 
이상하게 쉽다고 생각하며 풀었는데... 역시나 통과하지 못했다.
테스트코드는 통과했으나 최종 제출에서 과반수 이상이 실패했다.
 

문제를 잘못 이해했기 때문이었다.
h가 citations의 요소여야 한다고 생각했다.
하지만 그런 말을 어디에도 써있지 않았고... (거의 1시간을 고민했는데 왜 그렇게 이해했는지는 나도 미스테리다)
다른 풀이를 보기 전까지 알지 못했다.
문제의 입출력 예가 두 개정도 더 있었다면 좋았을 것 같다.
문제가 워낙 애매해서 다른 분들의 글을 봐도 모두 이해가 어려웠다고 써있었다.
 

모범풀이

function solution(citations) {

    citations.sort((a,b) => b - a); // 1
    let count = 0; // 2

    while(count+1 <= citations[count]) count ++; // 3

    return count; // 4
}

 
풀이는 정말 간단하지만 코드를 봐도 한 번에 이해되지 않았다.
아래 링크는 H-index에 대한 이해를 돕는 표이다.
 

출처: https://www.ibric.org/myboard/read.php?Board=news&id=270333

 

피인용수가 많은 순서대로 줄세우기 -> 위에서부터 논문 수를 하나씩 체크 -> 논문 수가 피인용자보다 작은 부분 중, 최대값이 H-index
 

  1. 피인용수가 많은 순서대로 줄세우기 => 내림차순 정렬

  2. 논문 수를 뜻하는 변수 count 생성

  3. 논문 수가 피인용자보다 작다면 -> 논문 수 하나씩 추가 -> 논문 수가 피인용자보다 커지면 반복 종료

  4. 논문 수 => H-index
     

  • 정확도 테스트 결과


     


참고

https://www.ibric.org/
https://laycoder.tistory.com/