[Java] H-index

allzeroyou·2025년 1월 21일
1

Java-Algorithm

목록 보기
10/26
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/42747?language=java

문제 설명

H-index: 과학자 생산성, 영향력 지표

논문 n편 중, h번 이상 인용된 논문이 h편 이상이고, 나머지 논문이 h번 이하 인용되었다면, h의 최댓값이 h-idx임.

입출력 예

인용횟수: citations

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

논문 5편 중, 3편의 논문이 3회이상(3,5,6) 인용됨. 나머지 2편은(0,1) 3회 이하 인용되었기에 h-idx는 3임.

풀이

h-idx 구하기.

(도통 감도 안온다.. 입출력 예시를 추가로 생각해보자)

n개 중, h번 이상인 요소가 h개 이상이고, 나머지 요소가 h번 이하라면 h의 최댓값 반환.

가령, [1,2,3,4]의 경우

  1. h 후보: 3
    3번 이상 인용 논문: 2개(3편 이상이 아니므로 탈락)

  2. h 후보: 2
    2번 이상 인용 논문: 3개(2편 이상 충족)
    나머지 논문: 1개(2번 이하 충족)

-> h-idx: 2

그렇다면, 내림차순 정렬해서 해당 논문의 인용 횟수 >= h 인지 체크 후, h의 최댓값 구하기.

정답 코드

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        
        // 1. 내림차순 정렬
        Integer[] ci = Arrays.stream(citations).boxed().toArray(Integer[]::new);
        
        Arrays.sort(ci, Collections.reverseOrder());
        
        // 2. 해당 논문의 인용 횟수 >= h 인지 체크
        for(int i=0; i<ci.length; i++){
            if(ci[i] >= i+1){
                answer=i+1;
            }else{
                break;
            }
           
        }
        return answer;
    }
}

int[]을 내림차순 정렬하기 위해 객체 배열로 변환하는 코드가 어려워서, 내림차순 정렬 없이 풀 수 있는 방법은 없나?하고 찾아봤는데, 아래와 같이 풀면 된다!

다른 사람의 풀이

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);
        for(int i=0; i<citations.length; i++){
            int smaller = Math.min(citations[i], citations.length-i);
            answer = Math.max(answer, smaller);
        }
        return answer;
    }
}
  • 추가

입력값인 int[]을 컬렉션화 하기 위해 stream()을 썼는데,해당 코드를 암기하기도 어렵고 실제 코테에선 기억이 안날거 같아서 아래와 같이 ArrayList를 생성하고, 추가하는 방법이 나을것 같다.

    public int solution(int[] citations) {
        int answer = 0;
        
        // 1. 내림차순 정렬
        ArrayList<Integer> list = new ArrayList<>();
        for (int num : citations) {
            list.add(num);
        }
        Collections.sort(list, Collections.reverseOrder());
profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글