728x90
๐๋ฌธ์ ๋ณด๋ฌ๊ฐ๊ธฐ
๐ง๐ป๐ปํ์ด ๊ณผ์
๋ณด์๋ง์ ์กฐํฉ(Combination)์ด ๋ ์ค๋ฅด๊ธด ํ๋๋ฐ, ์ด๊ฒ ์ ๋ง ๋จ์ํ ์กฐํฉ๋ง์ผ๋ก ํ๋ฆด๊น?... ์๊ฐ ์ด๊ณผ๊ฐ ๊ฑธ๋ฆฌ์ง ์์๊น?, ์ค๋ณต ๊ณ์ฐ์ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น? ๊ณ ๋ฏผ์ ํ๋๋ฐ, ์ธ ๋ฐ ์๋ ๊ณ ๋ฏผ์ด์๋จ ๊ฑธ ๊นจ๋ฌ์์ต๋๋ค.
์๋ฌด๋๋ ์ง์ ๊ฐ์๊ฐ 2N๊ฐ๋ฅผ ๋์ง ์๊ณ , N๊ณผ M์ ๊ฐ์๊ฐ ๊ทธ๋ ๊ฒ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ธ ๊ฒ ๊ฐ๋ค์. ๊ฒ๋ค๊ฐ, ์ง๊ณผ ์นํจ ์ง๋ง ์ฌ์ฉํ๋ \( N \times N \) ํฌ๊ธฐ๋ฅผ ๋ชจ๋ ํ์ํ ํ์๊ฐ ์๋ ์ ๋ ํ ๋ชซํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ก ์ด ๊ธธ์๋ค์. ์๋ฌดํผ ์ ํ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋์ ๋ด์ ์ง ์ขํ์ ์นํจ ์ง ์ขํ๋ฅผ ์ป์ด์, ๊ฐ๊ฐ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ์กฐํฉ์ ํตํด, ์นํจ ์ง๋ค ์ค M๊ฐ๋ฅผ ์ ํํ๋ค.
- M๊ฐ๋ฅผ ์ ํํ๋ค๋ฉด, ๊ฐ๊ฐ์ ์ง์ ๋ํด, M๊ฐ์ ์นํจ ์ง๋ค ์ค ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ๋ฅผ ์ ํํ์ฌ ํฉ์ฐํ๋ค. (์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ)
- ๊ตฌํ๋ ๊ณผ์ ์์ ํฉ์ฐ ๊ฐ์ด ์ต์ ๋์ ์นํจ ๊ฑฐ๋ฆฌ๋ณด๋ค ์ปค์ง๋ค๋ฉด, ๋ ์ด์ ๊ณ์ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ข ๋ฃ
- ์ข ๋ฃ ํ, ๋ค์ ์กฐํฉ์ผ๋ก ๋์ด๊ฐ์ ๋ค์ 3๋ฒ ๊ณผ์ ์ ์งํํ๋ค.
- ๋ชจ๋ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๋ค ํฉ์ฐํ๋ค๋ฉด, ์ต์ ๋์ ์นํจ ๊ฑฐ๋ฆฌ์ ๋น๊ตํ์ฌ ๋ ์์ ๊ฒ์ผ๋ก ๊ฐฑ์ ํ๋ค.
- ๋ชจ๋ ๋น๊ต๋ฅผ ๋ค ์๋ฃํ๋ค๋ฉด, ๋ต์ ์ถ๋ ฅํ๋ค.
โ๏ธ์์ค ์ฝ๋ ๋ฐ ๊ฒฐ๊ณผ
#include <iostream>
#include <vector>
using namespace std;
using Position = pair<int, int>;
class City
{
public:
City(int N, int M);
int GetMinChickenStreet();
private:
int GetDistance(const Position& p1, const Position& p2) { return abs(p1.first - p2.first) + abs(p1.second - p2.second); }
void GetMinChickenStreet(vector<int>& selectedChickens, int currentIdx);
private:
const int HOUSE = 1;
const int CHICKEN = 2;
const int INIT_VALUE = 1000000000;
vector<Position> _houses;
vector<Position> _chickens;
int _minChickenStreet = INIT_VALUE;
int _M;
};
City::City(int N, int M)
{
_M = M;
for (int row = 0; row < N; row++)
{
for (int col = 0; col < N; col++)
{
int information;
cin >> information;
if (information == HOUSE)
_houses.emplace_back(row, col);
else if (information == CHICKEN)
_chickens.emplace_back(row, col);
}
}
}
void City::GetMinChickenStreet(vector<int>& selectedChickens, int currentIdx)
{
if (selectedChickens.size() == _M)
{
int sum = 0;
for (int hi = 0; hi < _houses.size(); hi++)
{
int minDistance = INIT_VALUE;
for (const int& ci : selectedChickens)
minDistance = min(minDistance, GetDistance(_houses[hi], _chickens[ci]));
sum += minDistance;
if (sum > _minChickenStreet)
return;
}
_minChickenStreet = min(_minChickenStreet, sum);
return;
}
for (int i = currentIdx; i < _chickens.size(); i++)
{
selectedChickens.emplace_back(i);
GetMinChickenStreet(selectedChickens, i + 1);
selectedChickens.pop_back();
}
}
int City::GetMinChickenStreet()
{
vector<int> selectedChickens;
GetMinChickenStreet(selectedChickens, 0);
return _minChickenStreet;
}
int main()
{
ios::sync_with_stdio(false);
cout.tie(NULL); cin.tie(NULL);
int N, M;
cin >> N >> M;
City city(N, M);
cout << city.GetMinChickenStreet();
return 0;
}
728x90
๋ฐ์ํ
'๐คAlgorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 16198๋ฒ | ์๋์ง ๋ชจ์ผ๊ธฐ (C++) (0) | 2023.08.25 |
---|---|
[BOJ] 1759๋ฒ | ์ํธ ๋ง๋ค๊ธฐ (C++) (0) | 2023.08.25 |
[BOJ] 1309๋ฒ | ๋๋ฌผ์ (C++) (0) | 2023.08.24 |
[BOJ] 11048๋ฒ | ์ด๋ํ๊ธฐ (C++) (0) | 2023.08.23 |
[BOJ] 1003๋ฒ | ํผ๋ณด๋์น ํจ์ (C++) (0) | 2023.08.21 |