문제 설명

 

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

어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.

어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

 

제한사항

  • 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
  • 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.

나의 풀이

 

 이 문제에서 가장 어려웠던 접근 방법보단 사실 문제에 대한 이해였다. 일단 h-index라는 개념 자체가 처음 접하는 거였기에 정확힌 뭘 구라한 말인지를 이해를 못했다. 포인트는 (인용 횟수 = 인용된 논문 갯수) 중 최대값 이다. 이해를 위한 좀 더 상세한 예시를 아래에 적어보면

 

 논문수가 4개인데, 각 논문의 인용 횟수가 4 이상이면 리턴값도 4이다.

 논문수가 4개인데, 각 논문의 인용 횟수가 10, 8, 3, 0 이면 리턴값은 3이다.

 논문수가 4개인데, 각 논문의 인용 횟수가 10, 4, 1, 0 이면 리턴값은 2이다.

 

이와 같은데 주의해야 하는 조건이 하나 있는데 아래와 같다.

 

 논문수가 4개인데, 각 논문의 인용 횟수가 24, 22, 21, 20 이면 리턴값은 4이다.

 

왜 이 조건을 주의해야 했냐면, citations의 배열길이(논문의 갯수) < 인용 횟수 최대값이 되어버리기 때문에,

검사를 하는 반복문을 단순히 배열의 길이만큼만 반복하고 배열 중 최소값만 리턴해버리면 테스트에 실패하기 때문이다. 이 조건이 바로 테스트9 질문 페이지를 보면 테스트9의 조건이 무엇인지 물어보는 질문이 몇 있는데 이를 반영하지 못했기 때문이다. 코드2의 리턴 바로 앞 while문이 이 문제를 해소하기 위한 반복문이다.

 

 두 번째로 주의해야 하는 조건이자 이 문제의 오류점인데

 

 논문수가 4개인데, 각 논문의 인용 횟수가 10, 2, 2, 0 이면 리턴값은 2? 3?

 

 위의 조건에서는 인용된 논문수 = 인용횟수가 일치하는 수 자체가 없다. 이 부분을 어찌 다뤄야 하나 고민하다가 문제에서 이런 예외를 어찌 처리해야되는지 명시된 것이 없어서 질문 게시판을 보니 이를 눈치채고 문제를 풀어본 사람들이 해당 문제가 이 예외를 아예 취급하지 않는다는 내용을 보았다. 결과적으로 실제로 이런 기능을 구현하려면 보완이 필요해 보이는 부분이다.

 코드1 의 경우에는 다른 사람의 풀이법을 보고 새롭게 느껴진 접근법. 결국 리턴값은 논문수 를 초과할수 없다는 점을 포착해서 접근한 방법으로 좀 충격? 적이라 따라 작성해보고 첨부했다...

 

 

코드1

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);
        int min;
        for(int i = citations.length-1; i>=0; i--) {
            min = Math.min(citations.length-i, citations[i]);
            answer = Math.max(answer,min);
        }
        
        return answer;
    }
}

 

코드2

import java.util.*;

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

        int index = citations.length-1;
        int max = citations[index];
        int count = 0;

        if(max>0) {
            while(index>=0) {
                if(citations[index]>=max) {
                    count++;
                    index--;
                    if(count>=max) break;
                    continue;
                } else {
                    max--;
                    if(count>=max) break;
                    continue;
                }
            }
        }

        while(max>count) {
            max--;
        }

        return answer = count;
    }
}

+ Recent posts