본문 바로가기

Tech/[PS] Reviews

[프로그래머스-코딩테스트 연습] H-Index

Hi, There!
안녕하세요, 바오밥입니다.


목차

  • 문제
  • 풀이

 


문제

문제 내용

https://school.programmers.co.kr/learn/courses/30/lessons/42747?language=java

 

프로그래머스

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

programmers.co.kr

 


 

풀이

나의 풀이

- 단순하게 논문의 인용 값을 카운팅한 다음 answer 값과 비교하여 풀이했다.

import java.util.*;

class Solution {
    public int solution(int[] citations) {
//         N편 중 H번이상 인용된 논문이 H편 이상일 때 최댓값이 H-INDEX 값
        int answer = 1;
        int cnt;
        
//         1. 논문의 인용 값을 카운팅
//         비교하는 answer 값이 계속 달라지기 때문에 cnt 값도 반복할 때마다 0으로 초기화
//         2. 카운팅 값과 H 값을 비교 -> 두 가지의 경우의 수가 나옴.
//         카운팅한 값보다 크거나 같은 경우의 수 -> answer++
//         카운팅한 값보다 작은 경우의 수 -> answer-- 후 break
        while(true) {
            cnt = 0;
            
            for(int c : citations)
                if(c>=answer) cnt++;
            
            if(cnt >= answer) {
                answer++;
            }
            else {
                answer--;
                break;
            }
        }
        
        return answer;
    }
}

 

다른 사람의 풀이

- 주어진 논문의 인용 횟수 배열을 오름차순으로 정렬한다.

- 주어진 논문의 인용 횟수 배열의 길이가 논문의 수이므로, 논문의 수를 1씩 가감하며 반복한다.

이때,  ( 해당 요소의 논문 인용 횟수 >= h회이상 인용된 논문 개수)인 경우 더 이상 h-index 값이 늘 수 없으므로 체크하지 않는다.

여기서 h회이상 인용된 논문 개수는 오름차순 정렬했을 때 해당 요소부터 마지막 요소까지의 개수(=citations[i])를 의미한다.

import java.util.*;

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

        Arrays.sort(citations); // 오름차순 정렬

        // citations의 길이에서 1씩 가감 반복
        for(int i = citations.length - 1; i >= 0; i--) {
            // 이때 citations.length - i는 논문의 개수를 뜻하고 citations[i]는 논문의 인용 횟수를 뜻한다.
            // 즉, 논문의 개수가 논문의 인용 횟수보다 큰 경우 break 한다.
            if(citations.length - i >= citations[i]) break;
            answer++;
        }

        return answer;
    }
}