BOJ 15686. ์นํจ ๋ฐฐ๋ฌ
๐โโ๏ธ[Gold V] ์นํจ ๋ฐฐ๋ฌ - 15686
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2156 KB, ์๊ฐ: 416 ms
๋ถ๋ฅ
๋ฐฑํธ๋ํน, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ, ๊ตฌํ
์ ์ถ ์ผ์
2023๋ 12์ 25์ผ 15:10:44
๋ฌธ์ ์ค๋ช
ํฌ๊ธฐ๊ฐ NรN์ธ ๋์๊ฐ ์๋ค. ๋์๋ 1ร1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๋์์ ๊ฐ ์นธ์ ๋น ์นธ, ์นํจ์ง, ์ง ์ค ํ๋์ด๋ค. ๋์์ ์นธ์ (r, c)์ ๊ฐ์ ํํ๋ก ๋ํ๋ด๊ณ , rํ c์ด ๋๋ ์์์๋ถํฐ r๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ c๋ฒ์งธ ์นธ์ ์๋ฏธํ๋ค. r๊ณผ c๋ 1๋ถํฐ ์์ํ๋ค.
์ด ๋์์ ์ฌ๋ ์ฌ๋๋ค์ ์นํจ์ ๋งค์ฐ ์ข์ํ๋ค. ๋ฐ๋ผ์, ์ฌ๋๋ค์ "์นํจ ๊ฑฐ๋ฆฌ"๋ผ๋ ๋ง์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์นํจ์ง ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ด๋ค. ์ฆ, ์นํจ ๊ฑฐ๋ฆฌ๋ ์ง์ ๊ธฐ์ค์ผ๋ก ์ ํด์ง๋ฉฐ, ๊ฐ๊ฐ์ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๋ ๋ชจ๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ์ ํฉ์ด๋ค.
์์์ ๋ ์นธ (r1, c1)๊ณผ (r2, c2) ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|๋ก ๊ตฌํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์ง๋๋ฅผ ๊ฐ๋ ๋์๋ฅผ ์ดํด๋ณด์.
0 2 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 2
0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ด๋ค.
(2, 1)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-1| + |1-2| = 2, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |2-5| + |1-5| = 7์ด๋ค. ๋ฐ๋ผ์, (2, 1)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค.
(5, 4)์ ์๋ ์ง๊ณผ (1, 2)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-1| + |4-2| = 6, (5, 5)์ ์๋ ์นํจ์ง๊ณผ์ ๊ฑฐ๋ฆฌ๋ |5-5| + |4-5| = 1์ด๋ค. ๋ฐ๋ผ์, (5, 4)์ ์๋ ์ง์ ์นํจ ๊ฑฐ๋ฆฌ๋ 1์ด๋ค.
์ด ๋์์ ์๋ ์นํจ์ง์ ๋ชจ๋ ๊ฐ์ ํ๋์ฐจ์ด์ฆ์ด๋ค. ํ๋ ์ฐจ์ด์ฆ ๋ณธ์ฌ์์๋ ์์ต์ ์ฆ๊ฐ์ํค๊ธฐ ์ํด ์ผ๋ถ ์นํจ์ง์ ํ์ ์ํค๋ ค๊ณ ํ๋ค. ์ค๋ ์ฐ๊ตฌ ๋์ ์ด ๋์์์ ๊ฐ์ฅ ์์ต์ ๋ง์ด ๋ผ ์ ์๋ ์นํจ์ง์ ๊ฐ์๋ ์ต๋ M๊ฐ๋ผ๋ ์ฌ์ค์ ์์๋ด์๋ค.
๋์์ ์๋ ์นํจ์ง ์ค์์ ์ต๋ M๊ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ๋๋จธ์ง ์นํจ์ง์ ๋ชจ๋ ํ์ ์์ผ์ผ ํ๋ค. ์ด๋ป๊ฒ ๊ณ ๋ฅด๋ฉด, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์๊ฒ ๋ ์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(2 โค N โค 50)๊ณผ M(1 โค M โค 13)์ด ์ฃผ์ด์ง๋ค.
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๋์์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค.
๋์์ ์ ๋ณด๋ 0, 1, 2๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , 0์ ๋น ์นธ, 1์ ์ง, 2๋ ์นํจ์ง์ ์๋ฏธํ๋ค. ์ง์ ๊ฐ์๋ 2N๊ฐ๋ฅผ ๋์ง ์์ผ๋ฉฐ, ์ ์ด๋ 1๊ฐ๋ ์กด์ฌํ๋ค. ์นํจ์ง์ ๊ฐ์๋ M๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 13๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ ์ํค์ง ์์ ์นํจ์ง์ ์ต๋ M๊ฐ๋ฅผ ๊ณจ๋์ ๋, ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
- ์ฐ๊ตฌ์์ ๋น์ทํ ๋ฌธ์ ์๋ค.
๋ก์ง์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- m๊ฐ์ ์นํจ ์ง ๊ณ ๋ฅด๊ธฐ.
- ๋ณด๋๋ฅผ ์ํํ๋ฉด์ ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ฐพ๊ธฐ.
- ์์ ํ๋์ ๋ชจ๋ ๊ฒฝ์ฐ์์ ์ฒ๋ฆฌ.
- ๋์์ ์นํจ ๊ฑฐ๋ฆฌ์ ์ต์๊ฐ์ ์ฐพ๊ธฐ.
์ด ๋ก์ง์ ๋ฉ์ธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
int cal = 0;
void pick(int num, vector<int>& picked, int toPick)
{
if (toPick == 0)
{
// ์นํจ ์ง ์ ํํ๊ธฐ
for (int i = 0; i < picked.size(); ++i)
{
board[chick[picked[i]].first][chick[picked[i]].second] = 3;
}
// ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
cal = 0;
for (int i = 0; i < house.size(); ++i)
{
pair<int, int> h = { house[i].first, house[i].second };
int temp = 12345678;
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
if (board[y][x] == 3)
{
temp = min(temp,abs(h.first - y) + abs(h.second - x));
}
}
}
cal += temp;
}
res = min(res, cal);
// ์นํจ ์ง ์์๋ณต๊ตฌ
for (int i = 0; i < picked.size(); ++i)
{
board[chick[picked[i]].first][chick[picked[i]].second] = 2;
}
return;
}
int smallest = picked.empty() ? 0 : picked.back() + 1;
for (int next = smallest; next < num; ++next)
{
picked.push_back(next);
pick(num, picked, toPick - 1);
picked.pop_back();
}
}
์ข ๋ง๋ถ์์ ๋ฐฐ์ ๋ ์ฌ๊ท์ ์ผ๋ก ์์ด๋ง๋ค๊ธฐ๋ฅผ ์์ฉํด์ ํ์๋ค.
์นํจ์ง์ ์ ํํ ๋ ์์๋ก ๊ฐ์ 3์ผ๋ก ๋ณ๊ฒฝํด์ ์ ํํ ๊ฐ์ด ๋ฌด์์ธ์ง ์๊ฒ ํด์ฃผ์๋ค.
๊ณ์ฐ์ด ๋๋ฌ์ผ๋ฉด ๋ค์ ์์ ๋ณต๊ตฌ๋ฅผ ํด์ฃผ์ด์ผํ๋ค.
์ฌ๋๋ค์ด ๋ง์ด ํ์ด ๋ณธ ๋ฌธ์ ์ค ํ๋์ธ๋ฐ ์ค์ค๋ก ํ๊ณ ์ถ์ด์ ์๊ฐ์ด ๊ฑธ๋ ธ์ง๋ง ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ์๋ณด๊ณ ํ์๋ค..!!
๋งค์ฐ ๋ฟ๋ฏ
๐์ ์ฒด ์ฝ๋
// ์นํจ ๋ฐฐ๋ฌ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
// ๋น ์นธ : 0
// ์ง : 1
// ์นํจ์ง : 2
int n, m, res = 123456789, houseCnt, chickCnt;
vector<vector<int>> board;
vector<pair<int, int>> chick;
vector<pair<int, int>> house;
void setting()
{
cin >> n >> m;
board = vector<vector<int>>(n + 2, vector<int>(n + 2));
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
cin >> board[y][x];
if (board[y][x] == 1)
house.push_back({ y, x });
if (board[y][x] == 2)
chick.push_back({ y, x });
}
}
houseCnt = house.size();
chickCnt = chick.size();
}
int cal = 0;
void pick(int num, vector<int>& picked, int toPick)
{
if (toPick == 0)
{
// ์นํจ ์ง ์ ํํ๊ธฐ
for (int i = 0; i < picked.size(); ++i)
{
board[chick[picked[i]].first][chick[picked[i]].second] = 3;
}
// ์นํจ ๊ฑฐ๋ฆฌ ๊ตฌํ๊ธฐ
cal = 0;
for (int i = 0; i < house.size(); ++i)
{
pair<int, int> h = { house[i].first, house[i].second };
int temp = 12345678;
for (int y = 1; y <= n; ++y)
{
for (int x = 1; x <= n; ++x)
{
if (board[y][x] == 3)
{
temp = min(temp,abs(h.first - y) + abs(h.second - x));
}
}
}
cal += temp;
}
res = min(res, cal);
// ์นํจ ์ง ์์๋ณต๊ตฌ
for (int i = 0; i < picked.size(); ++i)
{
board[chick[picked[i]].first][chick[picked[i]].second] = 2;
}
return;
}
int smallest = picked.empty() ? 0 : picked.back() + 1;
for (int next = smallest; next < num; ++next)
{
picked.push_back(next);
pick(num, picked, toPick - 1);
picked.pop_back();
}
}
void solve()
{
// ์นํจ ์ง m๊ฐ๋ง ๋จ๊ธฐ๊ณ ๋ค ์์ค๋ค
// ์นํจ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค
// ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ํ๋ค
vector<int> test;
pick(chickCnt, test, m);
cout << res;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}