※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2110번 문제인 공유기 설치이다.
문제는 아래 링크를 확인하자.

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

 

2110번: 공유기 설치

첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가

www.acmicpc.net

이 문제는 가장 인접한 두 공유기 사이의 거리를 0과 1000000000 사이에서 이분탐색(binary search)을 통해 구하는 것으로 해결할 수 있다..

 

두 공유기 사이의 거리를 최소 dist 이상으로 두었을 때 설치할 수 있는 최대 공유기의 개수를 구해, 그 개수와 C를 비교하는 것으로 이분탐색을 진행해나갈 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <algorithm>
using namespace std;

int N, C;
int arr[200000];

int func(int dist) { // 간격이 dist 이상이게 최대한 설치
	int ret = 1;
	int old = arr[0];
	for (int i = 1; i < N; i++) {
		if (arr[i] - old >= dist) {
			old = arr[i];
			ret++;
		}
	}
	return ret;
}

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

	cin >> N >> C;
	for (int i = 0; i < N; i++) cin >> arr[i];
	sort(arr, arr + N);

	int L = 0, R = 1000000000;
	while (L < R) {
		int mid = (L + R) / 2 + 1;
		int val = func(mid);
		if (val < C) R = mid - 1;
		else L = mid;
	}

	cout << L;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 3896 // C++] 소수 사이 수열  (0) 2021.11.03
[BOJ 1477 // C++] 휴게소 세우기  (0) 2021.11.02
[BOJ 2819 // C++] 상근이의 로봇  (0) 2021.10.31
[BOJ 1450 // C++] 냅색문제  (0) 2021.10.30
[BOJ 1563 // C++] 개근상  (0) 2021.10.29

+ Recent posts