CodingTest

[CodingTest] 백준 1654번

동그리담 2024. 4. 13. 00:49

현재까지 푼 코딩테스트 중에 난이도도 제일 높고 시간도 제일 오래 걸린 문제였다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static long[] arrays;
    static long key;

    static long Binary_Search(long start, long end) {
        if (start > end) return -1;

        long mid = (start + end) / 2;
        long total = 0;
        for (long x : arrays) {
            total += x / mid;
        }

        if (total >= key) {
            return Math.max(mid, Binary_Search(mid + 1, end));
        } else {
            return Binary_Search(start, mid - 1);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long[] k_n = stringsToInts(br.readLine().split(" "));
        arrays = new long[(int) k_n[0]];
        key = k_n[1];
        long sum = 0;
        long max = 0;
        for (int i = 0; i < arrays.length; i++) {
            arrays[i] = Long.parseLong(br.readLine());
            sum += arrays[i];
            if (arrays[i] > max) {
                max = arrays[i];
            }
        }

        System.out.println(Binary_Search(1, max));
    }

    static long[] stringsToInts(String[] s) {
        long[] longs = new long[s.length];
        for (int i = 0; i < s.length; i++) {
            longs[i] = Integer.parseInt(s[i]);
        }
        return longs;
    }
}

======================

밑 코드들은 실패한 재귀함수와 

분할탐색을 안쓰고 푼 예시이다.

static long Binary_Search(long start, long end){
    if(start >= end){
        return start;
    }
    long mid = (start+end)/2;
    long total = 0;
    for(long x : arrays) {
        total += x / mid;
    }

    if(total >= key) return Binary_Search(mid,end);
    else return Binary_Search(start,mid-1);
}
public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long[] k_n = stringsToInts(br.readLine().split(" "));
        long[] lan_CM = new long[(int)k_n[0]];
        long sum=0;

        for (int i = 0; i < lan_CM.length; i++) {
            lan_CM[i]=Long.parseLong(br.readLine());
            sum+=lan_CM[i];
        }
        long end = Math.round((float)sum/k_n[1]);

        System.out.println(list_setting(lan_CM,end,k_n[1]));
    }
    static int list_setting(long[] arrays, long end, long n){
        Arrays.sort(arrays);
        long[] tmp_array;
        long total;
        int j;
        for (int i = (int)end; i > 0; i--) {
            total=0;
            tmp_array = arrays.clone();
            for (j = 0; j < arrays.length; j++) {
                tmp_array[j] = (long) Math.floor((double)tmp_array[j]/ i);
                total+=tmp_array[j];
            }
            if(total>=n)
                return i;
        }
        return -1;
    }

    static long[] stringsToInts(String[] s){
        long[] longs = new long[s.length];
        for(int i = 0; i < s.length; i++){
            longs[i] = Integer.parseInt(s[i]);
        }
        return longs;
    }
}