본문 바로가기

백준

1654 랜선 자르기


https://www.acmicpc.net/board/view/67789

 

글 읽기 - 자바) 두가지 방법의 이분탐색 차이점

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

 

 


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


public class Main {
	static long []arr;
	static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int K = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		arr = new long[K];
		long max = 0;
		for(int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i] = Long.parseLong(st.nextToken());
			max = Math.max(max, arr[i]);
		}
		System.out.println(binary_search(max));
	}
	static long binary_search(long max) {
		long start = 1;
		long end = max;
		while(start <= end) {
			long mid = (start + end) / 2;
			int sum = 0;
			
			for(long lan : arr) {
				sum += (lan / mid);
			}
			if(sum < N)
				end = mid -1;
			else
				start = mid + 1;
		}
		return end;
	}
}

 

 

 

 

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


public class Main {
	static long []arr;
	static int N;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int K = Integer.parseInt(st.nextToken());
		N = Integer.parseInt(st.nextToken());
		arr = new long[K];
		long max = 0;
		for(int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i] = Long.parseLong(st.nextToken());
			max = Math.max(max, arr[i]);
		}
		System.out.println(binary_search(1,max));
	}
	static long binary_search(long start, long end) {
		if(start > end) { //재귀 종결 조건
			return end;
		}
		long mid = (start + end) / 2;
		int sum = 0;
		for(long lan : arr) {
			sum += lan/mid;
		}
		if(sum < N)
			return binary_search(start, mid-1);
		else
			return binary_search(mid+1, end);
	}
}

 

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

[백준] 14889 스타트와 링크  (0) 2021.10.27
[백준] 2591 숫자카드  (0) 2021.10.25
10869 사칙연산  (0) 2021.10.18
5585 거스름돈  (0) 2021.10.14
2475 검증수  (0) 2021.10.14