: ๋์ ํ๋ก์ธ์ค์ ๋ฌธ์ ๊ฐ ์์.
๋ณ๊ฒฝํ๋ ค๊ณ ์๋ํด์ผ ํจ.
: ๋ฐํ๋๋ ์ต๋๊ฐ์ ํ๋ฃจ์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ธ์ก์ ํฉ์ผ๋ก ํด์ผ ํจ.
// 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์ ๋ํด์ ๋ง์ฝ์
์ด๋ ๊ฒ ๋์ด ์๋๋ฐ , 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;
}
์ ์ฅ!