백준 2110번 공유기 이진탐색

김동현·2022년 6월 28일
0
#include <iostream>
#include <algorithm>

using namespace std;

int N, C;
int x[200000];

int main()
{
	ios::sync_with_stdio(false);
	cout.tie(nullptr);
	cin.tie(nullptr);

	// 1. 집의 개수와 공유기의 개수를 입력 받는다.
	cin >> N >> C;

	// 2. 집의 좌표를 입력 받는다.

	for (int i = 0; i < N; ++i)
	{
		cin >> x[i];
	}

	// 3. 공유기 사이의 거리를 구하기 위해 집의 좌표를 정렬한다.
	sort(x, x + N);

	// 4. 이진 검색을 할 범위는 가장 인접한 공유기 사이의 거리 => [1, x[N - 1]]
	int s = 1, e = x[N - 1] + 1;
	int answer = 0;
	while (s < e)
	{
		// 4-1. 중앙값을 해의 후보로 정한다.
		// s : 1, e : 10, m : 5
		int m = (s + e) / 2;

		// 4-2. 실제로 m 거리만큼 떨어뜨렸을 때, 몇개의 공유기가 필요한지 계산한다.
		int count = 1;
		int iptime = x[0];

		for (int i = 0; i < N; ++i)
		{
			if (x[i] - iptime >= m)
			{
				++count;
				iptime = x[i];
			}
		}

		if (count < C)
		{
			e = m;
		}
		else
		{
			// 4-3. 최대 길이 최신화
			if (answer < m)
			{
				answer = m;
			}
			// 4-4. 더 찾을 수 있는지 범위 조절
			else
			{
				s = m + 1;
			}
		}
	}
	// 5. 최대 거리를 출력한다.
	cout << answer;
}

정신차리고 공부좀 더 하자..

profile
해보자요

0개의 댓글