[Lv2] H-Index

이말감·2022년 8월 14일
0

Programmers

목록 보기
28/32

프로그래머스 Lv2 H-Index

문제

링크

풀이

  • 틀린 풀이
function solution(citations) {
    let answer = 0;
    citations.sort((a, b) => a - b);
    console.log(citations)

    for (let i = 1; i < citations.length; i++ ) {
        if (citations[i] <= citations.slice(i).length) {
            answer = citations[i];
        }
        else {
            break;
        }
    }
    return answer;
}

우선 그냥 sort를 하면 숫자의 경우 제대로 되지 않기 때문에 b - a 혹은 a - b를 추가하여 정렬해주어야 한다.
이 문제를 처음 풀었을 때 오름차순으로 정렬한 후, slice를 이용해 해당 인덱스를 기준으로 arr.slice(i).length 이렇게 길이를 구한 후 비교를 해서 풀었는데 답이 왜????안나왔는지 이해를 못했다.

그래서 결국 다른 분들의 풀이를 살짝 참고해서 내림차순으로 정렬한 후 다시 풀어보았다.

function solution(citations) {
    citations.sort((a, b) => b - a);
    let answer = 0;
    while (answer + 1 <= citations[answer]) {
        answer += 1
    }
    return answer;
}

그리고 키포인트!!!!!

발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상

이 부분을 잘 읽고 머리를 잘 굴려보면..
발표한 논문을 내림차순으로 정렬했을 때, 인덱스의 값이 자신보다 큰 수의 갯수라는 것을 알 수 있다 !!!!!!!!!!!

예를 들면 citations이 [3, 0, 6, 1, 5] 일 때, 내림차순으로 정렬하면 [6, 5, 3, 1, 0]이 된다.
순서대로 인덱스가 0, 1, 2, 3, 4일 때 6보다 큰 수는 0개, 5보다 큰 수는 1개, ... 0보다 큰 수는 4개 이렇게 인덱스와 자신보다 큰 수의 갯수가 같다는 것을 알 수 있다.
또한 정렬했기 때문에 나머지 논문이 h번 이하 인용되었다는 것은 당연하기 때문에 이를 이용해서 문제를 풀면 된다.

h편 이상이기 때문에 자신도 포함하여 answer + 1 <= citations[answer] 을 조건으로 반복문을 돌리면 된다. 이 조건에 만족하지 않을 경우, 최댓값을 구하는 것이기 때문에 멈추고 answer를 출력하면 된다.

profile
전 척척학사지만 말하는 감자에요

0개의 댓글