Post

[프로그래머스] 42747번 - H-Index [Java][C++]

[프로그래머스] 42747번 - H-Index [Java][C++]

문제 링크


문제 설명

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

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

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


제한 사항

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

입출력 예

citationsreturn
[3, 0, 6, 1, 5]3

입출력 예 설명

이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.


1. 문제 풀이

H-Index는 h 번 이상 인용된 논문이 h 편 이상일 때 h 의 최댓값이다. 주어진 논문의 인용 횟수를 정렬한 후 조건에 맞춰 탐색하면 해결할 수 있다. 탐색 조건은 주어진 인용 횟수 배열을 순회하며 i 번 논문의 인용 횟수 x 에 대해 인용 횟수가 x 이상인 논문이 x 개 이상이면 x 는 H-Index 후보가 될 수 있다. i 번 논문의 인용 횟수 x 에 대해 인용 횟수가 x 이상인 논문이 x 개 미만일 경우(y) x 는 H-Index 후보가 못 되고 y 는 H-Index 후보가 될 수 있다.

예를 들면 입력이 [3, 3] 으로 주어질 경우 H-Index는 2 가 된다.


2. 코드

1. 정렬 [Java]

citations[i]i 번 논문의 인용 횟수이며, citations.length - ii 번 논문의 인용 횟수보다 인용 횟수가 많거나 같은 논문의 수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*;

class Solution {
    public int solution(int[] citations) {
        Arrays.sort(citations);

        int max = 0;
        for (int i = 0; i < citations.length; i++) {
            max = Math.max(max, Math.min(citations[i], citations.length - i));
        }

        return max;
    }
}

2. 정렬 [C++]

citations[i]i 번 논문의 인용 횟수이며, citations.length - ii 번 논문의 인용 횟수보다 인용 횟수가 많거나 같은 논문의 수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> citations) {
    sort(citations.begin(), citations.end());

    int mx = 0;
    for (int i = 0; i < citations.size(); i++) {
        mx = max(mx, min(citations[i], (int)citations.size() - i));
    }

    return mx;
}

3. 풀이 정보

1. 정렬 [Java]

정확성 테스트
테스트 1 〉 통과 (0.50ms, 70.2MB)
테스트 2 〉 통과 (0.62ms, 91.7MB)
테스트 3 〉 통과 (0.63ms, 69MB)
테스트 4 〉 통과 (0.84ms, 73.6MB)
테스트 5 〉 통과 (0.65ms, 80.4MB)
테스트 6 〉 통과 (0.75ms, 71.4MB)
테스트 7 〉 통과 (0.68ms, 87.1MB)
테스트 8 〉 통과 (0.39ms, 82.4MB)
테스트 9 〉 통과 (0.58ms, 84.7MB)
테스트 10 〉 통과 (0.47ms, 82.2MB)
테스트 11 〉 통과 (1.00ms, 84.7MB)
테스트 12 〉 통과 (0.39ms, 82.7MB)
테스트 13 〉 통과 (0.95ms, 82.3MB)
테스트 14 〉 통과 (0.67ms, 88.5MB)
테스트 15 〉 통과 (0.66ms, 81.7MB)
테스트 16 〉 통과 (0.35ms, 82.5MB)

2. 정렬 [C++]

정확성 테스트
테스트 1 〉 통과 (0.02ms, 4.21MB)
테스트 2 〉 통과 (0.03ms, 3.68MB)
테스트 3 〉 통과 (0.03ms, 4.2MB)
테스트 4 〉 통과 (0.03ms, 4.13MB)
테스트 5 〉 통과 (0.04ms, 4.21MB)
테스트 6 〉 통과 (0.04ms, 4.16MB)
테스트 7 〉 통과 (0.02ms, 4.18MB)
테스트 8 〉 통과 (0.01ms, 4.19MB)
테스트 9 〉 통과 (0.01ms, 4.14MB)
테스트 10 〉 통과 (0.02ms, 4.43MB)
테스트 11 〉 통과 (0.04ms, 4.21MB)
테스트 12 〉 통과 (0.01ms, 4.01MB)
테스트 13 〉 통과 (0.04ms, 4.19MB)
테스트 14 〉 통과 (0.03ms, 4.21MB)
테스트 15 〉 통과 (0.04ms, 4.19MB)
테스트 16 〉 통과 (0.01ms, 4.16MB)

This post is licensed under CC BY 4.0 by the author.