#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long int N, K, len, ans{ 0 };
vector<long long int> v;
long long int func(long long int num) {
long long int cnt = 0;
for (int i = 0; i < N; i++) {
cnt += (v[i] / num);
}
return cnt;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N >> K;
long long int max = 0;
for (int i = 0; i < N; i++) {
cin >> len;
v.push_back(len);
if (max <= len) max = len;
}
long long int left{ 1 }, right{ max }, mid;
while (left <= right) {
mid = (left + right) / 2;
if (func(mid) < K) right = mid - 1;
else if (func(mid) >= K) {
left = mid + 1;
if (mid > ans) ans = mid;
}
}
cout << ans;
}
func(n) : 랜선을 n(cm)로 잘랐을 경우의 개수를 반환
func(mid)가 요구하는 개수(K)보다 작은 경우 : right = mid - 1
func(mid)가 K보다 크거나 같은 경우 : 조건을 충족하는 최대값을 찾기 위해 ans를 갱신하고, left = mid + 1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long int N, K, len, ans;
vector<int> v;
long long int funt(long long int num) {
long long int cnt = 0;
for (int i = 0; i < N; i++) {
cnt += (v[i] / num);
}
if (cnt >= K) {
ans = num;
return ans;
}
else if (cnt < K) return -1;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N >> K;
for (int i = 0; i < N; i++) {
cin >> len;
v.push_back(len);
}
sort(v.begin(), v.end());
for (int i = 1; i <= v[N - 1]; i++) {
if (funt(i) == -1) break;
}
cout << ans;
}
for문으로 1부터 반복하며 무식하게,, 정답을 찾았으나, 시간초과가 나와서 for문을 이분탐색으로 바꾸어서 풀었다 ㅠ_ㅠ