알고리즘 & 자료구조/문제 풀이

[프로그래머스 알고리즘 고득점 Kit][정렬][Java] H-Index

수수다 2026. 5. 26. 20:08

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

같은 변수 h를 여러 곳에 사용하니까 문제를 이해하기 쉽지 않았다.

내림차순해서 하나씩 보면

6 5 3 1 0
1번째 논문을 보자 6번 이상 인용된 논문의 수는 1이다.
-> h번이상 인용된 논문의 수는 h이상 이라는 문장을 만족하는 h는 1이다.
2번째 논문을 보자 5번 이상 인용된 논문의 수는 2이다.
-> h번이상 인용된 논문의 수는 h이상 이라는 문장을 만족하는 h는 2이다.
3번째 논문을 보자 3번 이상 인용된 논문의 수는 3이다.
-> h번이상 인용된 논문의 수는 h이상 이라는 문장을 만족하는 h는 3이다.

4번째 논문을 보자 1번 이상 인용된 논문의 수는 4이다.
-> h번이상 인용된 논문의 수는 h이상 이라는 문장을 만족하는 h는 1이다.
5번째 논문을 보자 0번 이상 인용된 논문의 수는 5이다.
-> h번이상 인용된 논문의 수는 h이상 이라는 문장을 만족하는 h는 0이다.

논문의 수를 하나씩 증가하는 식으로 보면 최댓값을 쉽게 찾을 수 있다.
인용된 수는 점점 감소할테고 만족하는 논문의 수는 증가한다.
그 사이에서 현재까지 세고 있는 논문의 수 이상 인용되었는가?를 보면된다.
그래서 그 크기가 전환되는 지점이 최대가 된다는 것을 알 수 있다.


import java.util.*;

class Solution {
    //6 5 3 1 0
    public int solution(int[] citations) {
        Arrays.sort(citations);
        int len = citations.length;
        
        int h = 0;
        for(int i=len-1; i>=0; i--) {
            int citationCnt = citations[i]; //논문의 인용된 수
            int paperCnt = len - i; //현재까지 카운트하고 있는 논문의 수

            if(citationCnt >= paperCnt) {
            //현재까지 본 paperCnt편의 논문이 모두 paperCnt번 이상 인용되었는가?
                h = paperCnt;
            } else {
		break;
            }
        }
        
        return h;
    }
}