프로그래머스 - H-Index

이형석·2024년 6월 9일

알고리즘 Phase1

목록 보기
35/59

이 문제도 유형은 정렬이기는 한데, 구현이 상당히 어지러웠다.

일단 문제 이해하는 것 부터도 힘들었고, 설계도 아래 주석처럼 단계별로 딱딱 끊어보아야 겨우 구현할 수 있었다.

게다가 처음 제출 할 때도 거의 자포자기한 상태로 냈는데, 한 번에 성공해서 깜짝 놀랐다ㅋㅋ

  • h의 최댓값인 논문의 총 갯수부터 내려가며 검사 -> i = h = critations.length
    1. citations를 traverse하며, 인용횟수가 i번 이상인 논문이 i개 이상 있는지 검사
      -> 통과 시 2로, 아니면 continue
    1. citations를 travesre하며, 인용횟수가 i번 이하인 논문 갯수가 모두 i개 이하인지 검사
      -> 통과 시 답은 i & 답을 구했으므로 break, 아니면 continue
      (여기서 논리적으론, 1에서 citations에서 검사했던 나머지 논문들에 대해 travese해야 하는데, 어차피 i개 이하인 논문 갯수는 전체를 traverse해도 똑같음)
import java.util.*;
class Solution {
    public int solution(int[] citations) {
        //이게 대체 무슨 문제임
        int answer = 0;
        Arrays.sort(citations);
        //h 최댓값부터 시작 (citations.length부터)
        int h = citations.length;
        for(int i = h; i > 0; i--){
            //h번 이상이 h편 이상 
            //citations를 traverse하면서 i번 이상이 i개 이상 있는지, 없으면 continue
            int cnt = 0;
            for(int j = h-1; j >= 0; j--){
                //0 1 3 5 6
                if(citations[j] >= i){
                    cnt++;
                }else{
                    break;
                }
            }
            if(cnt < i){
                continue;
            }
            //나머지 모두 h번 이하면 answer = i
            //나머지 traverse하면서 다 i번 이하면 answer = i, break 아니면 continue
            cnt = 0;
            for(int j = h-1; j >= 0; j--){
                if(citations[j] <= i){
                    cnt++;
                }
            }
            if(cnt <= i){
                answer = i;
                break;
            }
        }
        return answer;
    }
}

그리고 h시작은 논문 갯수부터 시작하긴 하는데 어디까지 내려가야 할 지 모르겠어서 그냥 일단 냈는데 성공해버려서 사실 지금도 잘 모르겠다

profile
금융IT 개발자

0개의 댓글