프로그래머스 정렬 H-Index [JAVA] - 22년 8월 29일

Denia·2022년 8월 29일
0

코딩테스트 준비

목록 보기
51/201
package com.company;

import java.util.Arrays;

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

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

        //이진탐색으로 필요한 답을 찾아보자.
        answer = binarySearch(citations);

        return answer;
    }

    private int binarySearch(int[] citations) {
        //return 할 변수
        int answer = -1;
        //이진탐색에 필요한 left , right
        int left = 0;
        int right = citations.length;
        //전체 길이
        int totalLength = citations.length;

        //left가 right 범위를 넘어서는 순간까지 while
        while(left <= right) {
            //mid를 구한다.
            int mid = (left + right) / 2;

            //mid에 해당하는 값 에 해당하는 index를 구한다.
            int firstIndex = getFirstNumIndex(citations, mid);

            //규칙에 해당하는 값을 찾으면 mid 값을 answer에 할당 , 아니면 right 를 mid - 1 로 변경하고 다시 이진탐색
            if((totalLength - firstIndex) >= mid && firstIndex <= mid) {
                answer = mid;
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }

        return answer;
    }

    public int getFirstNumIndex(int[] arr, int num) {
        int left = 0;
        int right = arr.length-1;
        while (left < right) {
            int mid = (left + right) / 2;
            if (arr[mid] >= num) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }

        return right;
    }

    public int getNextNumIndex(int[] arr, int num, int left, int right) {
        while (left < right) {
            int mid = (left + right) / 2;
            if (arr[mid] > num) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }

        return right;
    }
}

다른 방법으로 풀이 : 규칙을 찾았으면 쉽게 풀수있게 되어있었다. ㅠㅠ

import java.util.*;

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

        int max = 0;
        for(int i = citations.length-1; i > -1; i--){
            int min = (int)Math.min(citations[i], citations.length - i);
            if(max < min) max = min;
        }

        return max;
    }
}
profile
HW -> FW -> Web

0개의 댓글