[프로그래머스] H-Index(자바)

지수·2021년 11월 1일
0
post-thumbnail

알고리즘 문제 풀이를 블로그에 올리는 이유는 풀이, 코드를 기록하기 위함이니
앞으로 문제를 다 긁어오기보다 링크만 두고 풀이가 잘 보이도록 포스팅 할 예정입니다!

📄 문제

[프로그래머스] H-index


👩‍💻 풀이

1. 문제 이해

이 문제는 H-index 값을 구하는 문제이다.(심플;)
그런데, 이 H-index 값을 이해하는 것부터 조금 애를 먹었다.(이해한 줄 알고 이상하게 풀다가 🚧삽질∞..🚧)
문제에서는 H-index 값을 아래와 같이 정의한다.

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

🚀 주의사항 💥

  • 1) h값은 주어진 citations 안에 있는 요소가 아니다.
    int[] citations = {9, 9, 9, 4}answer = 4 를 잘 생각해보자..!!!
  • 2) 반복문을 돈다면 반복문의 범위를 잘 따져봐야한다. (citations의 최댓값에 접근하지 못하고 있지는 않은지)
  • 3) 문제를 잘 읽자.. h번 이상 인용된 논문이 h편 이상이고 h번 이상 인용된 논문이 딱 h편이라고 하지는 않았다..이상! 상!

(사실 2),3)은 아래 나의 풀이에서 문제가 되었던 부분들이고, 프로그래머스에서 발견한 fancy한 풀이에서는..그닥 중요하지 않았다..ㅎ)


2. 풀이

중간 중간 주석은 디버깅의 흔적이다..ㅎ 더럽지만 코드 이해에 도움이 될 수도 있다고 판단하여 남겨두었다..!

  • 주어진 citations 배열 정렬
  • 큰 반복문(i) : 0~citations의 최댓값, citations 안에 있지 않은 잠재 h값 ++하면서 확인
  • 작은 반복문(j) : 위의 잠재 h값과 citations 요소 하나씩 비교,
    i 값이 citations[j] 보다 작으면 거기서 끊어 그 이상 인용된 논문 수 확인,
    인용된 논문 수가 잠재 h값인 i보다 크거나 같다면(h번 이상 인용된 논문이 h편 이상이고) h 값 갱신
import java.util.Arrays;

public class Solution {

    public static void main(String[] args) {
        int[] citations = {0, 0, 1};

        System.out.println("answer: " + solution(citations));
    }

    public static int solution(int[] citations) {
        Arrays.sort(citations);

        int h = 0;
        for(int i = 0; i <= citations[citations.length-1]; i++) {
//            System.out.println("현재 i : " + i);
            for(int j = 0; j < citations.length; j++) {
                if(i <= citations[j]) {
//                    System.out.println("i: " + i + " / j: " + j);
//                    System.out.println("남은 논문 수 : " + (citations.length-j));
                    if(i <= citations.length-j) {
                        h = i;
//                        System.out.println("h: " + h);
                    }
                    break;
                }
            }
        }

        return h;
    }
}

3. 프로그래머스에서 발견한 FANCY한 풀이🛸

import java.util.Arrays;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);
        for(int i=0; i<citations.length; i++){
            int smaller = Math.min(citations[i], citations.length-i);
            answer = Math.max(answer, smaller);
        }
        return answer;
    }
}
  • citations 정렬
  • 0~citation.length 돌면서,
    citation[i]와 i번 이상 인용된 논문 개수를 비교, 더 작은 것을 smaller에 할당
  • 계속 smaller를 갱신하고, answer는 이전 smaller 값과 새로운 smaller 값 중 큰 값(최대 h값)으로 갱신
profile
사부작 사부작

0개의 댓글