๐Ÿ˜6236๋ฒˆ. ์šฉ๋ˆ ๊ด€๋ฆฌ 2ํ”„๋กœ ๋ถ€์กฑํ•จ.

phoenixKimยท2022๋…„ 8์›” 3์ผ
0

๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
55/174

ํ’€์ด์ „๋žต

  • ์™œ ์ด๋ถ„ํƒ์ƒ‰์ด๋ƒ?

    : n๊ฐœ ์ค‘์—์„œ m๊ฐœ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ฝ‘์•„์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด
    ์™„ํƒ์œผ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด? 10๋งŒ * 10๋งŒ์ด ๋  ์ˆ˜ ์žˆ์Œ
    -> ๊ฒฐ๋ก  : logN์˜ ๋น„์šฉ์„ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฒ•์œผ๋กœ ๊ฐ€์•ผ ํ•จ.

๐Ÿ˜7ํผ์„ผํŠธ์—์„œ ํ‹€๋ฆผ.

: ๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ.
๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ด์•ผ ํ•จ.

  • ์ถœ๋ ฅ๋ฌธ์„ ํ†ตํ•ด์„œ ์ฒดํฌํ•จ์ˆ˜์—์„œ ๋ญ๊ฐ€ ์ž˜๋ชป๋ฌ๋Š”์ง€ ํ™•์ธํ•จ.


    -> 951์ผ๋•Œ๋Š” ์ด 3๋ฒˆ ๊บผ๋‚ด์•ผ ํ•จ. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž˜๋ชป๋จ.

๐Ÿ˜์ฃผ์˜ํ•  ๋ถ€๋ถ„ _ 2ํ”„๋กœ ๋ถ€์กฑํ•จ.

1.๋ฐ˜ํ™˜๋˜๋Š” ์ตœ๋Œ€๊ฐ’ ์„ค์ •.

: ๋ฐ˜ํ™˜๋˜๋Š” ์ตœ๋Œ€๊ฐ’์€ ํ•˜๋ฃจ์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ๊ธˆ์•ก์˜ ํ•ฉ์œผ๋กœ ํ•ด์•ผ ํ•จ.
// 987654321๋กœ ํ•˜๋ฉด ํ‹€๋ฆผ.

  • ์™œ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”์ง€?

    -> ์•„๋ฌด์ƒ๊ฐ์—†์ด ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ์ƒ์‹์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉด, ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋“ 
    ๋ˆ์˜ ์ตœ๋Œ€๊ฐ’์€ ํ•ฉ์‚ฐ์ด๋ฏ€๋กœ, ํ•ฉ์‚ฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ.


์ด๋ถ„ํƒ์ƒ‰ ๋ฌธ์ œ

: left์™€ right ๊ฐ’ ์„ค์ •์„ ์ž˜ํ•ด์•ผํ•จ!!

  • ์ฃผ์˜ํ• ์ .
    : ๋ฌธ์ œ๋Œ€๋กœ ํ’€์–ด๋‚˜๊ฐ€์„œ check ํ•จ์ˆ˜๋ฅผ == ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋ฉด,
    ๊ณ„์†ํ•ด์„œ Min๊ฐ’์ด ์ปค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ,
    ๋ถ€๋“ฑํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.

  • ์ƒ๊ฐํ•ด๋‚ด์ง€ ๋ชปํ•œ ๋ถ€๋ถ„.

1) ๋„๋Œ€์ฒด ๋ˆ์€ ์–ผ๋งˆ์ •๋„๊ฐ€ ์žˆ์–ด์•ผ ํ•  ๊ฒƒ์ธ๊ฐ€?
๋ˆ์˜ ๋ฒ”์œ„๋ฅผ ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•  ๊ฒƒ์ธ๋ฐ, ์–ผ๋งŒํผ์˜ ๋ˆ์„ ์„ค์ •ํ• ์ง€๋ฅผ
์ƒ๊ฐ์„ ๋ชปํ•จ.
-> ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ˆ๋“ค์˜ ๋ชจ๋“  ํ•ฉ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ž.

2) check ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ
๋ˆ์ด ๋ชจ์ž˜๋ผ์„œ ์ดˆ๊ธฐํ™”๋ฅผ ํ–ˆ๋Š”๋ฐ๋„, mid๊ฐ’์ด < v[i] ์ผ ๊ฒฝ์šฐ,
์ด๊ฒƒ์€ ์ ˆ๋Œ€ ๊ณ„์‚ฐ ์ž์ฒด๊ฐ€ ์•ˆ๋จ. ๊ณ„์†ํ•ด์„œ , ์ดˆ๊ธฐํ™”๋ฅผ ํ•  ๊ฒƒ์ž„.

์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ

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

int n, m;

bool check(vector<int>&v , int target)
{
	int cnt = 1;
	int num = target;

	for (int i = 0; i < v.size(); ++i)
	{
		if (num >= v[i])
		{
			num -= v[i];
		}
		// ๋ชจ์ž๋ž„ ๊ฒฝ์šฐ, ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ.
		else 
		{			
			num = target;
			++cnt;

			if (v[i] > target)
				return false;
			num -= v[i];
		}
	}

	// == ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฌด์กฐ๊ฑด mid ๊ฐ’์ด ์ปค์ง.
	return m >= cnt;
}


int main() 
{
	// n๋ฒˆ์„ ์ž…๋ ฅํ•ด์„œ, ํ•˜๋ฃจ๋งˆ๋‹ค ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก
	// 2๋ฒˆ์งธ ์ž…๋ ฅ๊ฐ’ : m์€ ์ •ํ™•ํžˆ ๊ต์ฒด๋˜์–ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์ž„. 
	cin >> n >> m;

	vector<int>v(n);
	int sum = 0;
	for (int i = 0; i < n; ++i)
	{
		cin >> v[i];
		sum += v[i];
	}

	// ์™œ ์ด๋ถ„ ํƒ์ƒ‰์ด๋ƒ? 
	// ํƒ€๊ฒŸํŒ… ๊ฐ’์„ ํ†ตํ•ด์„œ ๋ชจ๋“  n์„ ์ˆœ์ฐจ ํƒ์ƒ‰์„ ํ• ๊ฒƒ์ž„. 
	// ๊ทธ๋ฆฌ๊ณ , ๋ฐ˜๋“œ์‹œ m์˜ ํšŸ์ˆ˜๋งŒํผ์˜ ๋ˆ์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ.
	// m์€ ์—ฌ๊ธฐ์„œ 1๋งŒ์ž„. 
	// ๊ทธ๋Ÿฌ๋ฉด.. 10๋งŒ๋ฒˆ ์ˆœ์ฐจ ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ, 1๋งŒ ๋ฒˆ ํƒ์ƒ‰? 
	// ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•˜์ž.

	int Max = *max_element(v.begin(), v.end());
	int Min = *min_element(v.begin(), v.end());
	int result = Max;

	while(Min <= Max)
	{
		int mid = (Max + Min) / 2;

		if (check(v, mid))
		{
			//result = min(mid, result);
			result = mid;
			Max = mid - 1;
			
		}
		//false ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์€,,, 
		// m๋ฒˆ์„ ์ดˆ๊ณผํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ -> start  = mid + 1
		else
		{
			Min = mid + 1;
		}
	}

	cout << result;
}

๋‚ด ์ƒ๊ฐ์—๋Š” ์–ด์ฐจํ”ผ ์ž…๋ ฅ๊ฐ’ ๋“ค ์ค‘์—์„œ ์ฐพ๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•œ ํ›„, mid ๊ฐ’์„ ํƒ์ƒ‰ ํ–ˆ๋Š”๋ฐ,
๋ฐฑ์ค€์—์„œ ํ‹€๋ฆฌ๋Œ€... --;;

  • max ์™€ min ์„ ์ฒ˜์Œ์— ์„ค์ •์„ ์ž˜ํ•ด์•ผ ํ•จ.
    ์™œ ๊ทธ๋Ÿผ???!
    ์ผ๋‹จ ์กฐ๊ฑฐ์—์„œ ๊ธˆ์•ก์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—
    min = 1 ๋กœ ์„ค์ •ํ•ด์•ผ ํ•จ.

max์— ๋Œ€ํ•ด์„œ ๋งŒ์•ฝ์—

์ด๋ ‡๊ฒŒ ๋˜์–ด ์žˆ๋Š”๋ฐ , m์ด 1 ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด??
๋‚ด ์ƒ๊ฐ๋Œ€๋กœ ์›์†Œ์˜ ์ตœ๋Œ€๊ฐ’ 500๊ฐ€์ง€๊ณ ๋Š” ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Œ!
์ตœ๋Œ€ํ•œ ํฐ์ˆ˜๋กœ ์„ค์ •์„ ํ•ด์•ผํ•จ.
๊ทธ๊ฒŒ ๋„๋Œ€์ฒด ์–ผ๋งˆ์ธ๋ฐ? ํ•ฉ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ...

์ตœ์ข… ์ฝ”๋“œ

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

int n, m;

bool check(vector<int>&v , int target)
{
	int cnt = 1;
	int num = target;

	for (int i = 0; i < v.size(); ++i)
	{
		if (num >= v[i])
		{
			num -= v[i];
		}
		// ๋ชจ์ž๋ž„ ๊ฒฝ์šฐ, ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ.
		else 
		{			
			num = target;
			++cnt;

			if (v[i] > target)
				return false;
			num -= v[i];
		}
	}

	// == ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฌด์กฐ๊ฑด mid ๊ฐ’์ด ์ปค์ง.
	return m >= cnt;
}


int main() 
{
	// n๋ฒˆ์„ ์ž…๋ ฅํ•ด์„œ, ํ•˜๋ฃจ๋งˆ๋‹ค ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก
	// 2๋ฒˆ์งธ ์ž…๋ ฅ๊ฐ’ : m์€ ์ •ํ™•ํžˆ ๊ต์ฒด๋˜์–ด์•ผ ํ•˜๋Š” ๊ธˆ์•ก์ž„. 
	cin >> n >> m;

	vector<int>v(n);
	int sum = 0;
	for (int i = 0; i < n; ++i)
	{
		cin >> v[i];
		sum += v[i];
	}

	// ์™œ ์ด๋ถ„ ํƒ์ƒ‰์ด๋ƒ? 
	// ํƒ€๊ฒŸํŒ… ๊ฐ’์„ ํ†ตํ•ด์„œ ๋ชจ๋“  n์„ ์ˆœ์ฐจ ํƒ์ƒ‰์„ ํ• ๊ฒƒ์ž„. 
	// ๊ทธ๋ฆฌ๊ณ , ๋ฐ˜๋“œ์‹œ m์˜ ํšŸ์ˆ˜๋งŒํผ์˜ ๋ˆ์„ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ.
	// m์€ ์—ฌ๊ธฐ์„œ 1๋งŒ์ž„. 
	// ๊ทธ๋Ÿฌ๋ฉด.. 10๋งŒ๋ฒˆ ์ˆœ์ฐจ ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ, 1๋งŒ ๋ฒˆ ํƒ์ƒ‰? 
	// ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•˜์ž.

	int Max = sum;
	int Min = 1;
	int result = Max;

	while(Min <= Max)
	{
		int mid = (Max + Min) / 2;

		if (check(v, mid))
		{
			//result = min(mid, result);
			result = mid;
			Max = mid - 1;
			
		}
		//false ๊ฐ€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์€,,, 
		// m๋ฒˆ์„ ์ดˆ๊ณผํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธ -> start  = mid + 1
		else
		{
			Min = mid + 1;
		}
	}

	cout << result;
}

์  ์žฅ!

profile
๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด