728x90

 

문제설명

입력 & 출력

나의 풀이

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        int h = 0;
        Arrays.sort(citations);

        for(int i = citations.length-1 ; i >= 0 ; i--){
            if(citations[i] >= h+1){
                h++;
            }else{
                break;
            }
            
        }
        return h;
    }
}

 

이번 문제는 H-Index를 구하는 문제입니다.

 

H-Index란 "h"개의 논문이 각각 최소한 "h"번 인용된 가장 큰 숫자 "h"를 의미합니다.

 

즉 "h"개의 논문이 각각 최소한 "h"번 이상 인용된 경우, 그 연구자의 H-Index는 "h"입니다.

 

예제가 [3,0,6,1,5]가 있다면 

 

  • 1번 이상 인용된 논문이 1개 이상 있느냐 : Yes 4개(1,3,5,6)  ➡ h는 1 이상
  • 2번 이상 인용된 논문이 2개 이상 있느냐 : Yes 3개(3,5,6)  ➡ h는 2 이상
  • 3번 이상 인용된 논문이 3개 이상 있느냐:  Yes 3개(3,5,6)  ➡ h는 3 이상
  • 4번 이상 인용된 논문이 4개 이상 있느냐 : No 2개(5,6)  ➡ h는 4 이상 ❌

 

따라서 저의 접근 방식은 다음과 같습니다.

 

citations 배열을 정렬을 한다. ➡  6, 5, 3, 1, 0

                                      H-Index 1, 2, 3, 4, 5

 

▶ 위와 같이 접근을 한다면 1번의 반복으로 H-Index를 구할 수 있습니다.

  •  H-Index가 1인 경우 1개 이상 인용된 논문이냐  ➡ 6  >= 1 True
  •  H-Index가 2인 경우 2개 이상 인용된 논문이냐 ➡ 5  >= 2 True
  •  H-Index가 3인 경우 3개 이상 인용된 논문이냐 ➡ 3  >= 3 True
  •  H-Index가 4인 경우 4개 이상 인용된 논문이냐 ➡ 0  >= 4 False

따라서 H-Index의 값은 최댓값인 3이 됩니다.


접근하는 방식이 헷갈리지 코드는 어렵지 않습니다.

 

먼저 H-Index를 조작할 변수 h를 초기화해 주고, Arrays.sort() 메서드를 사용하여 배열을 오름차순으로 정렬합니다.

 

그리고 for문을 뒤에서부터 접근하여 큰 값부터 순회를 합니다.

 

만약에 배열의 요소가 크다면 h가 1번 이상 인용되었다는 논문이기 때문에 h는 1 이상이고, 조건에 맞으면 계속해서 h의 값을 증가시켜 줍니다.

 

그러면 h가 4일 때 조건을 만족하지 않기 때문에 h는 3이 됩니다.