Algorithm/자료구조

[백준] 알고리즘 C++ 1654번 - 랜선 자르기문제

낭강 2021. 10. 10. 14:25
문제

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

www.acmicpc.net

소스코드
#include <iostream>
#include <algorithm>
#include <string>
#include <limits.h>
using namespace std;
long long arr[10001];
int k, n;
void binnary_search() {
	long long left = 1, right = LLONG_MAX-1;
	long long max = 0;
	while (left<=right) {
		long long mid = (left + right) / 2;
		long long temp = 0;
		for (int i = 1; i <= k; i++) {
			temp+= (arr[i]/mid);
		}
		if (temp >= n) {
			left = mid + 1;
			if (mid > max) {
				max = mid;
			}
		}
		else {
			right = mid - 1;
		}
	}
	cout << max;
}
int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	 
	cin >> k >> n;
	for (int i = 1; i <= k; i++) cin >> arr[i];
	binnary_search();
	
}
해설

자를 랜선의 길이를 정해서 이미 가지고 있는 랜선에서 자를때 자를 수 있는 개수가 주어졌을 때 최대로 자를 수 있는 랜선의 길이를 구해야한다.

그렇다면 1~21억이되는 숫자의 랜선길이를 다 해보면 좋겠죠?

하지만 이는 너무 비현실적이니 이분탐색을 통해 중간지점에서 결과값을 확인하고 계속해서 반으로 줄여나가면서 경우의 수를 조금 줄여봅시다.

나누어진 개수가 N보다 크거나 같을 때 mid값을 조금 올려서 n에 근접하게 합니다.

나누어진 개수가 N보다 작을때는 mid값이 너무 크다는 이야기닌깐 미드값을 줄여주기 위해 오른쪽 값을 mid -1로 설정해줍니다.

문제는 이분탐색으로 해결하면 쉽게해결 할 수 있습니다.

또한 int로 하면 실패가 뜨니 long long으로 해결하면 됩니다.