[C++] 1654: 랜선 자르기

우나·2022년 12월 7일

백준

목록 보기
12/16

정답코드

#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문을 이분탐색으로 바꾸어서 풀었다 ㅠ_ㅠ

0개의 댓글