알고리즘

프로그래머스 JS | H-index

3jun 2022. 11. 5. 01:41
출처 : 프로그래머스 - 코딩테스트 연습 - 정렬 - H-index

❌ Solution ( 정확성 6.3 / 100 )

function solution(citations) {
    let answer = 0;
    const newArr = citations.sort((a,b) => b-a);
    
    for(let i = 0; i < newArr.length; i++) {
        let count = 0;    
        const standard = newArr[i];
        newArr.forEach(function(el) {
            if(el >= standard) count++; 
        })
        
        if( standard >= count ) answer = standard;
    }
    return answer;
}

1. h의 최댓값을 찾기 위해 논문을 인용된 횟수 순으로 내림차순 정렬한 newArr 배열을 선언한다.

2. 인용된 횟수 순으로 내림차순 정렬된 newArr의 원소를 처음부터 반복문으로 돌면서 해당 논문의 인용횟수 이상 인용된 요소가 있다면 count를 1 더한다.

3.반복문이 끝나고 타겟이 되는 논문의 인용횟수 standard보다 standard 인용횟수 이상의 논문 갯수 count가 크다면 count를 return 한다. ( standard 값 === h번, h번 이상 인용된 논문 === count 이므로)

 

위 로직이 틀린 이유는 아래 입출력 예시를 조급 변형하여 3번 이상 인용된 논문이 하나 더 있다고 가정해보면 확인할 수 있다. 

주어진 논문 배열이 [6, 5, 3, 3, 1, 0]과 같이 3번 인용된 논문이 하나 더 있다면 count 값은 3이 아니라 4가 된다.

standard count
6 1
5 2
3 4
1 5
0 6

이런 경우 standard 는 3, count 는 4이므로 standard >= count 조건을 만족하지 않기 때문에 h값이 최댓값인 3이 아니라 standard >= count 조건을 만족하는 standard 값 5가 출력되므로 오답이 된다. 

✅ Solution

위에 오답 풀이가 아무리 생각해도 논리적으로 이상이 없다고 생각되었는데, 계속 오답에 정확도가 너무 떨어져서 고민 하다가 내림차순 정렬한 배열의 반복문 내부의 마지막 if 문에서 answer = standard 대신 answer = count 로 수정 하였더니 정답이었다.

function solution(citations) {
    let answer = 0;
    const newArr = citations.sort((a,b) => b-a);
    
    for(let i = 0; i < newArr.length; i++) {
        let count = 0;    
        const standard = newArr[i];
        newArr.forEach(function(el) {
            if(el >= standard) count++; 
        })
        
        if(standard >= count) answer = count;
    }
    return answer;
}

💡❓

위에서 틀린 예시와 비교해 보았을 때, 값이 h 값의 최댓값인 3이 아니라 2가 출력되므로 오답이 되어야 했다. 하지만 정답이 된걸로 봐서는 내가 문제를 잘못 이해한 것 같은데, 어디서부터 잘못 이해했는지 잘 모르겠다. 

💡✅

h index, 허쉬 지표는 연구자의 모든 논문 중 h회 이상 인용된 논문이 h개 이상일 때, 이 둘을 동시에 만족하는 h의 최대값이다.

논문의 인용횟수를 하나씩 돌면서 h 회 이상 인용된 논문이 h개보다 같거나 클때를 구해주면 되므로, 인용된 횟수를 횟수별로 확인하여 인용된 횟수보다 더 큰 숫자를 가진 논문들의 갯수의 최대값을 구하면 되는 문제였다. 

function solution(citations) {
    const newArr = citations.sort((a,b) => b-a);
    
    let i = 0;
    while (i + 1 <= newArr[i]) {
        i++;
    }
    
    return i;
  }
참고
- https://en.wikipedia.org/wiki/H-index
- https://www.youtube.com/watch?v=dAeOI0mfijE&t=60
- https://haesoo9410.tistory.com/310
- https://taesung1993.tistory.com/39