[BOJ 2110] ๊ณต์ ๊ธฐ ์ค์น
๐ ๋ฌธ์
https://www.acmicpc.net/problem/2110
๐ป ์ฝ๋
#include <iostream>
#include <algorithm>
using namespace std;
int N, M;
int arr[200001];
int main() {
cin >> N >> M;
for (int i = 0; i < N; i++) cin >> arr[i];
sort(arr, arr + N);
int start = 1;
int end = arr[N - 1] - arr[0];
int mid = 0;
int result = 0;
while (start <= end) {
mid = (start + end) / 2;
int cnt = 1; // ๋ฐฐ์น๋ ๊ณต์ ๊ธฐ ๊ฐ์
int temp = 0;
for (int i = 1; i < N; i++) {
int len = arr[i] - arr[temp];
if (len >= mid) {
cnt++;
temp = i;
}
}
if (cnt < M) end = mid - 1;
else {
result = mid;
start = mid + 1;
}
}
cout << result << '\n';
}
๋ฉ๋ชจ๋ฆฌ ๋ฐ ์๊ฐ
๐ก ํ์ด
๊ฐ์ฅ ์ธ์ ํ ๋ ๊ณต์ ๊ธฐ ์ฌ์ด์ ์ต๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ์ ์ผ ์ฒซ๋ฒ์งธ ์ง์๋ ๋ฌด์กฐ๊ฑด ๊ณต์ ๊ธฐ๋ฅผ ์ค์นํ ๊ฒ → ์ต๋ ๊ฑฐ๋ฆฌ๊ฐ ๋์ฌ ์ ์์
int cnt = 1; // ๋ฐฐ์น๋ ๊ณต์ ๊ธฐ ๊ฐ์
int temp = 0;
for (int i = 1; i < N; i++) {
int len = arr[i] - arr[temp];
if (len >= mid) {
cnt++;
temp = i;
}
}
temp๋ ๋ง์ง๋ง์ผ๋ก ๊ณต์ ๊ธฐ๊ฐ ์ค์น๋ ์ขํ๊ฐ ์ ์ฅ๋ ์ธ๋ฑ์ค
- ๋ง์ง๋ง์ผ๋ก ์ค์น๋ ๊ณต์ ๊ธฐ ์์น์ ํ์ฌ ์ง์ ์ขํ๋ฅผ ๋น๊ตํ์ฌ mid, ์ฆ ์ต๋๊ฑฐ๋ฆฌ๋ก ๊ฐ์ ํ ๊ฑฐ๋ฆฌ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ํด๋น ์ง์ ์ขํ์ ๊ณต์ ๊ธฐ ์ค์น๊ฐ ๊ฐ๋ฅ
- ๊ณต์ ๊ธฐ ์ค์น ํ temp ๊ฐ์ ๋ง์ง๋ง์ผ๋ก ์ค์น๋ ๊ณต์ ๊ธฐ ์ขํ(i)๋ก ๊ฐฑ์ ๋ฐ ์ค์น๋ ๊ณต์ ๊ธฐ ๊ฐ์(cnt)๋ฅผ ์ฆ๊ฐ
if (cnt < M) end = mid - 1;
else {
result = mid;
start = mid + 1;
}
- ์ค์นํ๊ณ ์ ํ๋ ๊ณต์ ๊ธฐ ๊ฐ์(M)๋ณด๋ค ํ์ฌ ์ต๋ ๊ฑฐ๋ฆฌ๋ก ๊ฐ์ ํ ๊ฐ(mid)์์ ์ค์น๋ ๊ณต์ ๊ธฐ ๊ฐ์(cnt)๊ฐ ๋ ์์ผ๋ฉด ๊ฑฐ๋ฆฌ๋ฅผ ์ค์ธ๋ค
- cnt๊ฐ ๋ ํฌ๋ฉด result๋ฅผ ๊ฐฑ์ ํ๊ณ ๊ฑฐ๋ฆฌ๋ฅผ ๋ ๋๋ฆฐ ํ ๋ค์ ๊ณ์ฐํ๋ค