본문 바로가기
PS/프로그래머스

[프로그래머스 *Java] - H-Index

by Jman 2022. 7. 20.

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

조건

제한시간 : 45분이내

이번 문제는 문제를 이해하는 게 어려웠다.
만약에 H-Index 라는 개념을 알고있다면, 조금 문제를 풀기는 쉬웠을 것이다.

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

문제 문장 중에 윗말이 가장 중요한 거 같다.

논문 당 피인용 횟수의 데이터를 받은 citations을 내림차순으로 정렬한 뒤 문제를 해결해보았다.

아래는 총 세 가지 경우의 수를 확인해서 어떤 부분을 신경써서 로직을 설계해야 하는지 설명하겠다.

citiations == H-Index
citations : [3, 0, 6, 1, 5]
논문 idx \ 피인용 수, H-Index 피인용 수 H-Index
  6 1
  5 2
3 == 3 3 3
  1 4
  0 5

=> 순차적으로 탐색해서 H-Index 와 피용수가 같아 질 때가 H-Index의 최대값


citiations < H-Index
citations : [2, 0, 6, 1, 5]  

논문 idx \ 피인용 수, H-Index 피인용 수 H-Index
  6 1
  5 2
2 < 3 2 3
  1 4
  0 5
=> 순차적으로 탐색하다가 H-Index 가 피인용수보다 커질 경우 그 전 H-Index가 최대값


citiations > H-Index
citations : [6, 6, 6, 6, 6]
논문 idx \ 피인용 수, H-Index 피인용 수 H-Index
  6 1
  6 2
  6 3
  6 4
6 < 5 6 5
=> 순차적으로 탐색하다가 H-Index 가 피인용수보다 적을경우, H-Index 최대값은 마지막 수


이렇게 고려해서 아래 테스트 테스트케이스 그림에 맞춰 문제를 설계하면 된다.

테스트 케이스

 

 

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Integer[] array = new Integer[citations.length];
        
        for (int i = 0; i < citations.length; i++) {
            array[i] = citations[i];
        }
        
        Arrays.sort(array, new Comparator<Integer>() {
            @Override
            public int compare(Integer i1, Integer i2) {
                return i2 - i1;
            }
        });

        //통과
        for (int i = 0; i < array.length; i++) {
            if(array[i] >= i+1) {
                answer += 1;
            }else if(array[i] < i+1) {
                break;
            }
        }
        
        
        return answer;
    }
}