본문 바로가기
Algorithm/프로그래머스 고득점 Kit

[정렬] H-Index - Java 풀이

https://programmers.co.kr/learn/courses/30/lessons/42747

 

코딩테스트 연습 - H-Index

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

programmers.co.kr

 

문제

접근

H-Index는 발표한 N개의 논문중 h이상 인용된 논문이 h이상이여야 하므로,

해의 범위가 0 ~ N 이다.

나는 역순정렬후 H-index를 N부터 0까지로 순회하면서 H-index 이상 인용된 논문이 H개 이상인지를 확인후

루프를 탈출하도록 구현해보았다. 

 

풀이

import java.util.Arrays;
import java.util.Comparator;
public class Solution {
    public  int solution(int[] citations) {
        Integer[] tmp = Arrays.stream(citations).boxed().toArray(Integer[]::new); //정렬을 위해서는 boxing 필요
        Arrays.sort(tmp, Comparator.reverseOrder());
        int hindex = citations.length;
        while(hindex>=0) { //hindex의 값의 범위는 0 ~ 발표한 논문수 사이이다.
            int cnt = 0;
            for (int i = 0; i < tmp.length; i++) {
                if (tmp[i] >= hindex) // h번 이상 인용되었으면 count
                    cnt++;
                else break; // 아닌 순간에는 정렬되어있으므로 뒤는 더 볼 필요 없다.
            }
            if (hindex <= cnt) // h이상 인용된 논문이 h이상이면
                return hindex;
            hindex--;
        }
        return 0;
    }
}

 

유명한 풀이

아래 풀이에 감탄하고 발췌 해왔습니다.

 public int solution2(int[] citations) {
    Arrays.sort(citations);
    int max = 0;
    for(int i = citations.length-1; i >= 0; i--){
        int min = (int)Math.min(citations[i], citations.length - i);
        if(max < min) max = min;
    }
    return max;
}

성능적으로도 우월한 코드네요.. 정말 감탄했습니다.

댓글 반응이.. 웃기네요ㅋㅋㅋㅋㅋㅋ