[BaekJoon 2798][๐ค2] ๋ธ๋์ญ
โ ๋ฌธ์
๐ฏ ๋์ด๋
Bronze ๐ค2
๐ง ํ์ด
1. ๋ด ํ์ด (๋ธ๋ฃจํธ ํฌ์ค)
- ์๊ณ ๋ฆฌ์ฆ
Brute Force
- ์ค๋ช
- ์๊ฐ ์ ํ
1์ด - ๋ฉ๋ชจ๋ฆฌ ์ ํ
128MB 3 <= N <= 100
์ด๋ผ๋ ์กฐ๊ฑด ํ์์๋, ๋ธ๋ฃจํธ ํฌ์ค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํด์ ์ผ์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ฐ๋จํ ํด๊ฒฐํ๋ค.
์ฌ์ค์ ์ฝ๋๋ก๋ง ๋ฐ์ง๋ง ์์ ํ ๊ฐ๋ตํ๊ฒ ์ผ์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก๋ง ํ ์ ์์ง๋ง, ๊ฐ์ธ์ ์ผ๋ก ์กฐ๊ธ์ด๋ผ๋ ๋ ์ต์ ํ๋ฅผ ํ๊ณ ์ถ์ด์ ๊ฐ์ง์น๊ธฐ์ฉ ์ฝ๋๋ฅผ ๋ง์ด ์ถ๊ฐํ๋ค.
์ผ์ค ๋ฐ๋ณต๋ฌธ์ ์์ ํ์ ๋ฐฉ์์ด๋ฏ๋ก O(Nยณ)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
- ์ฝ๋
๋ด ํ์ด ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int iN{}, iM{};
cin >> iN >> iM;
vector<int> vecCard(iN, 0);
for(int i = 0; i < iN; ++i)
{
cin >> vecCard[i];
}
sort(vecCard.begin(), vecCard.end());
int iMax{ 0 };
for(int i = 0; i < iN - 2; ++i)
{
int iSum1{ vecCard[i] };
// ํ์ฌ ์์ ์ต์๊ฐ์ด iM๋ณด๋ค ํฌ๋ฉด ๋ฐ๋ก break;
if(iSum1 + vecCard[i + 1] + vecCard[i + 2] > iM)
{
break;
}
// ํ์ฌ ์์ ์ต๋๊ฐ์ด iMax๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๊ฑด๋ ๋
else if(iSum1 + vecCard[iN - 1] + vecCard[iN - 2] <= iMax)
{
continue;
}
for(int j = i + 1; j < iN - 1; ++j)
{
int iSum2{ iSum1 + vecCard[j] };
// ์ง๊ธ ๊ฐ์ด iM๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๋ฐ๋ก break;
if(iSum2 >= iM)
{
break;
}
// ํ์ฌ ์์ ์ต๋๊ฐ์ด iMax๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด ๊ฑด๋ ๋
else if(iSum2 + vecCard[iN - 1] <= iMax)
{
continue;
}
for(int k = j + 1; k < iN; ++k)
{
int iSum3{ iSum2 + vecCard[k] };
// ์ํ๋ ๊ฐ ์ฐพ์ผ๋ฉด ๋ฐ๋ก ์ถ๋ ฅ ํ ์ข
๋ฃ
if(iSum3 == iM)
{
cout << iM;
return 0;
}
// ์ต์ข
๊ฐ์ด iM๋ณด๋ค ํฌ๋ฉด break;
else if(iSum3 > iM)
{
break;
}
// ์กฐ๊ฑด ๋ง์กฑ์ iMax ๊ฐ ๊ฐฑ์
iMax = iMax < iSum3 ? iSum3 : iMax;
}
}
}
cout << iMax;
return 0;
}
2. ์ถ๊ฐ ํ์ด (ํฌ ํฌ์ธํฐ)
- ์๊ณ ๋ฆฌ์ฆ
Two Pointer
- ์ค๋ช
๋ด ํ์ด๊ฐ ์๋ง ๋ฌธ์ ์์ ์๋ํ ์ ์์ ๊ฐ๊น๋ค๊ณ ๋ ์๊ฐํ์ง๋ง, ๊ทธ๋๋ ์ด ํ์ด๊ฐ ๋ ์ข์ ๋ณด์ฌ์ ๊ฐ์ ธ์๋ค.
ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด์ ๋ฐ๋ณต๋ฌธ์ ์ธ ๋ฒ ์ค์ฒฉ์์ ๋ ๋ฒ ์ค์ฒฉ์ผ๋ก ์ค์ผ ์ ์๋ค. ์๋ ์์ผ๋ก ๊ฝค๋ ํฐ ์ด๋์ด๊ธฐ ๋๋ฌธ์, ์ฐ๋ฉด ์๋ ์ด์ ๊ฐ ์๋ค. ๋ฌผ๋ก ํฌ ํฌ์ธํฐ๋ฅผ ์ฐ๊ธฐ ์ํด ์ ๋ ฌ์ ํด์ผํ์ง๋ง, ์ด๋ sort๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถ๋ด ์์ด ํด๊ฒฐํ ์ ์๋ค.
ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ฐ๋ณต๋ฌธ ์ค์ฒฉ์ ํ ๋ฒ ์ค์ฌ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(Nยฒ)์ด๋ค.
- ์ฝ๋
์ถ๊ฐ ํ์ด ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int iN{}, iM{};
cin >> N >> M;
vector<int> vecCard(iN);
for(int& iCard : vecCard)
{
cin >> iCard
}
// ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ๋ ฌ ํ์
sort(vecCard.begin(), vecCard.end());
int iMax{};
for (int i = 0; i < iN - 2; ++i)
{
int iLeft{ i + 1}, iRight{ N - 1 };
while (iLeft < iRight)
{
int iSum = vecCard[i] + vecCard[iLeft] + vecCard[iRight];
if (iSum == iM)
{
cout << iM;
return 0;
}
// ํฉ์ด iM๋ณด๋ค ์์ผ๋ฉด iMax ๊ฐฑ์ ํ๊ณ ++iLeft๋ก ๋ฒ์ ์ถ์
if (iSum < iM)
{
iMax = max(iMax, iSum);
++iLeft;
}
// ํฉ์ด iM ๋ณด๋ค ์์ ๊ฒฝ์ฐ --iRight๋ก ๋ฒ์ ์ถ์
else
{
--iRight;
}
}
}
cout << iMax;
}
๐ญ ํ๊ธฐ
๋๋ ๋ธ๋ฃจํธ ํฌ์ค๋ฅผ ์ฐ๊ณ ์ต์ ํ๋ฅผ ์ํด ๋ง์ ๊ฐ์ง์น๊ธฐ์ฉ ์ฝ๋๋ฅผ ์ถ๊ฐํ์ง๋ง, ํฌ ํฌ์ธํฐ๋ง์ผ๋ก๋ ๊ฐ๋จํ ๋ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค๋ ๊ฒ์ ์์๋ค.
๊ฐ๋จํ ํ๋ ค๋ ์ข ๋ ๋์ ํ์ด ๋ฐฉ๋ฒ์ ์์์ง ๊ณ ๋ฏผํด๋ณด๋ ์๊ฐ์ ๊ฐ์ง๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
Comments