[JS] H-Index 근데 이제 정렬을 곁들이지 않은...

2022. 7. 25. 18:15알고리즘/programmers

이 문제 유형이 정렬입니다.

음... 아마 도수 정렬이나 이진 탐색을 수행하는 것 같습니다.

근데 이거 정렬 안하고도 충분히 풀 수 있을 것 같아서 한 번 트라이 해봤습니다.

 

몇몇 가지 요소만 주의하면 쉽게 풀리는 문제니 같이 한번 보실까요?


문제 요약

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

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

 

제한사항

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

 

테스트 케이스

citations return
[3, 0, 6, 1, 5] 3

 

접근 방법

일단 문제가 되게 이상하게 써있는데 (나머지에 대해서 약간 이해가 잘 안되었던 것 같습니다.)일단 어떤 h-index 기준으로 논문의 인용수가 이상이고 나머지가 그 이하라면 h-index 이고 만족하는 최댓값을 찾는게 목적입니다.

 

조심하셔야 할 건 citations 배열에 있는 값만 h-index가 아니라는 것 입니다. 예시로 들면, 2나 4도 기준만 만족하면 h-index가 될 수 있다는 점이네요.

 

h-index의 제한 사항이 있네요. 인용횟수가 0회 이상 10,000회 이하입니다. 충분히 loop를 돌려도 만족하겠네요.그래서 정렬이 필요가 없습니다.그러면 정답 코드 같이 보시죠.

 

정답 코드

function solution(citations) {
    const n = citations.length;
    let h = 0;
    let [right, left] = [n, 0];
    while (h < 10000) {
        right = citations.filter(v => v >= h).length;
        left = n - right;
        if (h <= right && h >= left) break;
        h++;
    }
    while (h <= right && h >= left) {
        h++;
        right = citations.filter(v => v >= h).length;
        left = n - right;
    }
    return h - 1;
}

 

팁 1. 첫 번째 루프: h-index를 만족하는 최솟값 찾기.

while (h < 10000) {
    right = citations.filter(v => v >= h).length;
    left = n - right;
    if (h <= right && h >= left) break;
    h++;
}

 

h를 증가시키면서 h-index에 맞는 최솟값이 나올때 까지 루프를 지속합니다.

 

팁 2. 두 번째 루프: h-index를 만족하는 최댓값 찾기.

while (h <= right && h >= left) {
    h++;
    right = citations.filter(v => v >= h).length;
    left = n - right;
}

 

첫 번째 루프랑 내부는 똑같습니다. 다만, 종료 조건이 반대네요.

 

생각보다 쉬웠네요.

그럼 이만!