반응형

문제 설명

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.

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

 

나의 풀이 (java)

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        ArrayList<Integer> citationList = new ArrayList();
        for(int num : citations) {citationList.add(num);}
        Collections.sort(citationList, Collections.reverseOrder());

        if(citationList.get(0)==0) return 0;

        for(int h=citationList.size()-1; h>=0; h--){
            if(h < citationList.get(h)){
                answer = h+1;
                break;
            }
        }
        return answer;
    }
}

내가 사용한 방법

배열을 한번 역순 정렬(큰수가 가장 앞) => 큰 수에서 하나씩 빼면서 조건에 맞는지 확인 => 예외 추가(길이가 ==0 종료)

여기서, 조건이 중요한 로직 포인트인데

  • 큰수부터 작은수로 정렬했기 때문에 배열[h] 값이 숫자 h+1보다 크거나 같음
    = h+1 이상의 값이 최소 h개 이상 존재
    = 위 내용을 for문과 조건으로 작성하여 해결

다른 사람의 풀이

  • 중요 로직은 같음
  • 디테일한 부분에서 불필요한 로직을 줄일수 있음
    • Arrays.sort(citations) 해서 사용하면 3줄을 1줄로 줄일 수 있다
    • if조건대신 Math.max or min을 사용하여 판단 가능

 

느낀점

  • list를 정렬하는 여러가지 방법
    • 1. Collections (java.utils 기본 적인 정렬을 사용)
    • 2. List.sort() 사용 (compare 직접 구현 = 복잡한 정렬을 사용할때)
      같으면0, 작으면 음수, 크면 양수로 return;
      => Result 클래스의 result1,result2를 a로 정렬, a값이 같다면 d값으로 정렬 (= order by a,d)
list.sort(new Comparator<SectionStatisticsResult>() {
    @Override
    public int compare(SectionStatisticsResult result1, SectionStatisticsResult result2) {
        int compareResult = result1.getAptNo().compareTo(result2.getAptNo());
        if(compareResult == 0 && result1.getDong() != null && result2.getDong() != null) compareResult = result1.getDong().compareTo(result2.getDong());
        return compareResult;
    }
});
  • 큰/작은 값을 찾을때 if가 아닌 Math.max() / Math.min() 을 사용하자
반응형

+ Recent posts