백준 - 1654번 : 랜선 자르기 (C++)

RoundAbout·2023년 11월 30일
0

BaekJoon

목록 보기
39/90

주어진 K개의 랜선을 적당한 크기로 나눠 N개 이상의 새로운 랜선들을 만들어내야한다.

Left = 1 , Right = K개 랜선중 최대 길이
Half = (Left + Right) / 2 라 치면

Half로 나눈 값들의 총 합이 N 이상이다
-> 정답 갱신 후 다음 Half값이 더 커지도록 Left = Half + 1로 갱신

Half로 나눈 값들의 총 합이 N 미만이다
-> 다음 Half값이 더 작아지도록 Right = Half - 1로 갱신

반복 후 구해진 최댓값 출력

여기서 주의할 점은 주어진 랜선 길이의 최댓값이 2^32 - 1이라 했으니 산술 오버플로우가 발생하지 않도록 길이와 관련된 변수를 unsinged int나 long long등의 해당 숫자까지 표현할 수 있는 자료형으로 선언해줘야 한다는 것이다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

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

	int N, K;
	cin >> K >> N;

	vector<unsigned int> vecLine(K);

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

	sort(vecLine.begin(), vecLine.end());

	unsigned int Left = 1;
	unsigned int Right = vecLine[K - 1];

	unsigned int Answer = 0;

	while (Left <= Right)
	{
		int Cnt = 0;
		unsigned int Half = (Left + Right) / 2;

		for (int i = 0; i < K; ++i)
		{
			Cnt += vecLine[i] / Half;
		}

		if (Cnt >= N)
		{
			Answer = max(Answer, Half);
			Left = Half + 1;
		}

		else
		{
			Right = Half - 1;
		}

	}

	cout << Answer;

}

profile
게임하고 피자 좋아함

0개의 댓글

관련 채용 정보