본문 바로가기
Algorithm/BOJ

[BOJ]1654번: 랜선 자르기 (c++)

by HBGB 2020. 7. 8.

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 <vector>
#include <algorithm>

using namespace std;

int count_possible_line(vector<int> &lines, long long len)
{
	int cnt = 0;
	for (int i = 0; i < lines.size(); ++i)
	{
		cnt += lines[i] / len;
	}
	return cnt;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	// 입력
	int K, N;
	cin >> K >> N;
	vector<int> lines(K);
	for (int i = 0; i < K; ++i)
	{
		cin >> lines[i];
	}

	// 이분탐색
	long long answer = 0;
	long long left = 1;
	long long right = *max_element(lines.begin(), lines.end());

	while (left <= right)
	{
		long long mid = (left + right) / 2;
		int cnt = count_possible_line(lines, mid);

		// 개수가 N이상이면 더 크게 자를수 있는지 확인해야 함
		if (cnt >= N)
		{
			// 자르는 크기 최대값 갱신
			answer = max(mid, answer);
			left = mid + 1;
		}
		else
		{
			right = mid - 1;
		}
	}

	// 출력
	cout << answer;

	return 0;
}

 

 

랜선의 길이는 2^31 - 1보다 작거나 같은 자연수이다.

 

이분탐색으로 조건을 만족하는 수를 찾는 문제인데, 자료형의 크기를 주의해야 한다

mid = (left + right) / 2  중간값을 찾을 때 int형의 범위를 넘을 수 있기 때문에

long long형을 써야 한다.

 

 

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]2110번: 공유기 설치 (c++)  (0) 2020.07.08
[BOJ]2805번: 나무 자르기 (c++)  (0) 2020.07.08
[BOJ]11728번: 배열 합치기 (c++)  (0) 2020.07.07
[BOJ]10816번: 숫자 카드 2 (c++)  (0) 2020.07.07
[BOJ]10815번: 숫자 카드 (c++)  (0) 2020.07.07

댓글