반응형
12-24 00:25
Today
Total
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
관리 메뉴

개발하는 고라니

[백준] 2512번 : 예산 본문

Programming/백준

[백준] 2512번 : 예산

조용한고라니 2021. 3. 14. 19:28
반응형
 

2512번: 예산

첫째 줄에는 지방의 수를 의미하는 정수 N이 주어진다. N은 3 이상 10,000 이하이다. 다음 줄에는 각 지방의 예산요청을 표현하는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 값들은 모두 1 이상

www.acmicpc.net


[이분/이진 탐색, Binary Search]

우선, 이진 탐색을 하기 전 입력받은 각 지방의 예산(arr[])을 모두 더한 값과 국가예산의 총액(limit)을 비교하였다.

(총액 >= 예산들의 합) 이라면 예산 중 가장 큰 값을 출력하고 종료한다. 이와 같은 경우가 아니라면 이진 탐색으로 넘어간다.

 

init) left = 1, right = 국가예산의 총액

1) 상한선(mid) 구하기 : mid = (left + right) / n

2) 각 지방의 예산 모두 더하기(sum), 단 예산 > 상한선일 경우 상한선을 더함

3) sum과 limit 비교

 

3-1) sum <= limit

- 상한선의 최대값 갱신

- right = (mid + 1) * n

 

3-2) sum > limit

- left = (mid - 1) * n

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        long arr[] = new long[n], sum = 0;

        StringTokenizer st = new StringTokenizer(br.readLine());
        for(int j=0; j<n; j++) {
            arr[j] = Integer.parseInt(st.nextToken());
            sum += arr[j];
        }

        Arrays.sort(arr);

        long limit = Integer.parseInt(br.readLine());

        if(sum <= limit){
            System.out.println(arr[n-1]);
            System.exit(0);
        }

        long left = 1, right = limit, max = 0;
        while(left <= right){

            long mid = (left + right) / n;
            sum = 0L;

            for(int i=0; i<n; i++)
                sum += Math.min(arr[i], mid);

            if(sum <= limit){

                max = Math.max(max, mid);

                right = (mid + 1) * n;
            }
            else
                left = (mid - 1) * n;
        }
        System.out.println(max);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 2668번 : 숫자고르기  (0) 2021.03.15
[백준] 13565번 : 침투  (0) 2021.03.14
[백준] 2617번 : 구슬 찾기  (0) 2021.03.14
[백준] 1058번 : 친구  (0) 2021.03.14
[백준] 9019번 : DSLR  (0) 2021.03.13
Comments