본문 바로가기

알고리즘/Programers

Programmers - 정렬 [H - Index]

1. 문제

문제 설명

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

입출력 예

citationsreturn

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

입출력 예 설명

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

 

2. 내풀이

import java.lang.reflect.Array;
import java.util.*;

public class HIndex {
    public int solution(int[] citations) {
        int N = citations.length;
        int H = 0;
//        Integer[] citations1 = new Integer[N];
//
//        for (int i = 0; i < N; i++) {
//            citations1[i] = citations[i];
//        }
//

        Arrays.sort(citations);

        for (H = N + 1; H < -1; H++) {
            int overH = 0;
            ArrayList<Integer> restCitation = new ArrayList<>();
            for (int i = 0; i < N; i++) {
                if (citations[i] >= H) overH++;
                else {
                    restCitation.add(citations[i]);
                }
            }
            int sum = 0;
            for (int page : restCitation) {
                sum += page;
            }
            if (overH >= H && sum <= H) return H;
            if (overH == N) return N;
        }

        return H;
    }

    public static void main(String[] args) {
        HIndex hIndex = new HIndex();
        int[] citations = {31, 61};
        System.out.println(hIndex.solution(citations));
    }
}

- 있는 테스트 코드를 다 때려부었는데도 안된다..

-> 알고보니 문제를 잘못 이해했다. 근데 문제가 이상한것 처럼 느껴졌다.

-> 나머지 원소들의 합이 H를 넘지 않아야 하는 것인줄 알았다.

 

H보다 크거나 같은 원소들을 제외한 나머지 원소들은 각각 H보다 작으면 된다. 하지만 이것은

H보다 크거나 같은 원소들을 고려하는 것과 완벽히 대칭되므로 해당사항만 클리어하면 매우 쉽다.

테스트 케이스중 {3, 3, 3, 3, 2, 2 ,1}의 값은 3이 되어야 했다.

import java.lang.reflect.Array;
import java.util.*;

public class HIndex {
    public int solution(int[] citations) {
        int N = citations.length;
        int H = 0;

        Arrays.sort(citations);
        // H의 최대값을 구하는 것이므로 N부터 시작한다. H는 본질 적으로 원소의 값을 넘는 갯수를 의미한다.
        for (H = N; H > -1; H--) {
            //원소중 H를 넘는 논문의 수
            int overH = 0;
            for (int i = 0; i < N; i++) {
                if (citations[i] >= H) overH++;
            }
            // H를 넘는 논문의 수가 H보다 크거 같다면 H를 반환
            // H를 넘는 논문을 제외한 다른 논문은 생각할 필요가 없다. 왜냐면 H를 넘는 논문을 고려한 순간
            // 자동으로 배제되는 경우이기 때문이다.
            if (overH >= H) return H;
        }
        return H;
    }

    public static void main(String[] args) {
        HIndex hIndex = new HIndex();
        int[] citations = {};
        System.out.println(hIndex.solution(citations));
    }
}

3. 다른 사람 풀이

public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);
 
        for (int i = 0; i < citations.length; i++) {
            int h = citations.length - i;
 
            if (citations[i] >= h) {
                answer = h;
                break;
            }
        }
 
        return answer;
    }

- 문제를 잘못이해했다. H보다 크거나 같은 원소들을 제외한 나머지 원소들은 각각 H보다 작으면 된다. 하지만 이것은

H보다 크거나 같은 원소들을 고려하는 것과 완벽히 대칭되므로 해당사항만 클리어하면 매우 쉽다.

테스트 케이스중 {3, 3, 3, 3, 2, 2 ,1}의 값은 3이 되어야 했다.

4. Tip

- 문제를 똑바로 보자.....