백준 2512번: 예산 [이분탐색][매개변수탐색] - Java :: 매운코딩
728x90
300x250

https://www.acmicpc.net/problem/2512

 

2512번: 예산

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

www.acmicpc.net

 

<순서>

1. 요청 정렬

2. 범위 탐색

3. X 더해서 예산 편성

4. 합 비교하여 범위 조정

 

<Java 코드>

import java.io.BufferedReader;
import java.io.FileInputStream;
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 {
		// TODO Auto-generated method stub

		//System.setIn(new FileInputStream("Test.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int N = Integer.parseInt(st.nextToken());
		
		int arr[] = new int[N];
		st = new StringTokenizer(br.readLine());
		for (int i = 0; i < arr.length; i++) {
			arr[i] = Integer.parseInt(st.nextToken());
		}
		
		st = new StringTokenizer(br.readLine());
		int M = Integer.parseInt(st.nextToken());
		
		//정렬
		Arrays.sort(arr);
		
		//상한액 X 선언
		int x = Integer.MIN_VALUE;
		
		//조사범위 선언
		int start = 1;
		int end = arr[N-1];
		
		//이분탐색
		while(start <= end) {
			int mid = (start+end)/2;
			
			//mid값으로 각각 예산 요청 가능한지 체크
			int sum = 0;
			for (int i = 0; i < arr.length; i++) {
				sum += Math.min(arr[i], mid);
			}
			
			if(sum == M) {
				x = mid;
				break;
			} else if (sum > M ) {
				//예산을 넘어가게되면 상한액을 낮춰야함
				end = mid -1;
			} else {
				//예산이 남으면 상한액을 올려보자
				start = mid+1;
				x = Math.max(x, mid);
			}
		}
		
		System.out.println(x);
	}

}
728x90

+ Recent posts