Development Logs/Algorithms

[JAVA] 프로그래머스 : H-Index (코딩테스트 고득점 kit > 정렬)

유뱅유뱅뱅 2020. 7. 20. 18:43

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

 

코딩테스트 연습 - H-Index

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

programmers.co.kr

문제 이해부터 설계까지 어려웠음.. (해결은 했으나 나중에 한번 더 풀어봐야할듯)

 

해결 방안

1. 위의 제시된 문제를 보고 일단 인용횟수를 담은 배열인 citations를 오름차순 정렬해야겠다고 생각했음
 => 정렬을 해놓으면 인용된 논문이 h편 이상인 경우를 찾으면 나머지 논문이 h번 이하 인용되어있는지 확인 안해도 되므로

2. 그리고 정렬된 citations배열을 돌면서 i일 때 가질 수 있는 가장 큰 논문 편수를 h로 정함
 => (h = citations.length-i) h편 이상이므로 해당 i번째 논문을 포함 할 수 있기 때문에

3. 해당 i번째 citations[i]가 h 이상인지 확인 후, answer = h; break;
=> 뒤로 갈수록 i가 커져 논문 편수(h)가 줄어듬으로 break; (처음 조건을 만족하는 h가 가장 최댓값)

 

코드

import java.util.*;

// H-Index
// 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 
// 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 H-Index
// citations: 어떤 과학자가 발표한 논문의 인용횟수를 담은 배열
class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        
        // 0 1 3 5 6
        Arrays.sort(citations);
        
        // n편 중 h번 이상 인용된 논문이 h편 이상 일때 h의 최댓값이 h-index
        int h;
        for(int i=0; i<citations.length; i++){
            
            // i일때 가장 큰 h값(논문 편수)
            h = citations.length-i;
            
            // 논문 인용횟수가 h 이상인지 확인
            if(citations[i] >= h){
                answer = h;
                break;
            }
        }
        
        return answer;
    }
}