๋์ด๋ : ๊ณจ๋ 5
๊ฑธ๋ฆฐ ์๊ฐ : 1์๊ฐ
๋ฌธ์
์๊ธฐ 2012๋ ! ๋๋์ด 2๋ ๊ฐ ์๋ง์ ๊ตญ๋ฏผ๋ค์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ ๊ฒ์ ACM Craft (Association of Construction Manager Craft)๊ฐ ๋ฐ๋งค๋์๋ค.
์ด ๊ฒ์์ ์ง๊ธ๊น์ง ๋์จ ๊ฒ์๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ACMํฌ๋ํํธ๋ ๋ค์ด๋๋ฏนํ ๊ฒ์ ์งํ์ ์ํด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ ํด์ ธ ์์ง ์๋ค. ์ฆ, ์ฒซ ๋ฒ์งธ ๊ฒ์๊ณผ ๋ ๋ฒ์งธ ๊ฒ์์ด ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ๋ค๋ฅผ ์๋ ์๋ค. ๋งค ๊ฒ์์์ ์ ๊ฑด๋ฌผ์ ์ง๋ ์์๊ฐ ์ฃผ์ด์ง๋ค. ๋ํ ๋ชจ๋ ๊ฑด๋ฌผ์ ๊ฐ๊ฐ ๊ฑด์ค์ ์์ํ์ฌ ์์ฑ์ด ๋ ๋๊น์ง Delay๊ฐ ์กด๋ฌธ์
์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง๊ธฐ ์ํด์ ์ฐ๊ตฌ์์ ๋ฒฝ์ ์ธ์ฐ๋ ค๊ณ ํ๋ค.
์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ N×M์ธ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ง์ฌ๊ฐํ์ 1×1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ์ฐ๊ตฌ์๋ ๋น ์นธ, ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๋ฒฝ์ ์นธ ํ๋๋ฅผ ๊ฐ๋ ์ฐจ์งํ๋ค.
์ผ๋ถ ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ์นธ์ผ๋ก ๋ชจ๋ ํผ์ ธ๋๊ฐ ์ ์๋ค. ์๋ก ์ธ์ธ ์ ์๋ ๋ฒฝ์ ๊ฐ์๋ 3๊ฐ์ด๋ฉฐ, ๊ผญ 3๊ฐ๋ฅผ ์ธ์์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ฐ๊ตฌ์๊ฐ ์๊ธด ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
์ด๋, 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ๊ณณ์ด๋ค. ์๋ฌด๋ฐ ๋ฒฝ์ ์ธ์ฐ์ง ์๋๋ค๋ฉด, ๋ฐ์ด๋ฌ์ค๋ ๋ชจ๋ ๋น ์นธ์ผ๋ก ํผ์ ธ๋๊ฐ ์ ์๋ค.
2ํ 1์ด, 1ํ 2์ด, 4ํ 6์ด์ ๋ฒฝ์ ์ธ์ด๋ค๋ฉด ์ง๋์ ๋ชจ์์ ์๋์ ๊ฐ์์ง๊ฒ ๋๋ค.
2 1 0 0 1 1 0
1 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 1 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ๋ค์ ๋ชจ์ต์ ์๋์ ๊ฐ์์ง๋ค.
2 1 0 0 1 1 2
1 0 1 0 1 2 2
0 1 1 0 1 2 2
0 1 0 0 0 1 2
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
๋ฒฝ์ 3๊ฐ ์ธ์ด ๋ค, ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ ์๋ ๊ณณ์ ์์ ์์ญ์ด๋ผ๊ณ ํ๋ค. ์์ ์ง๋์์ ์์ ์์ญ์ ํฌ๊ธฐ๋ 27์ด๋ค.
์ฐ๊ตฌ์์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋ ์ป์ ์ ์๋ ์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํ์ด
- ๋ฒฝ 3๊ฐ๋ฅผ ๊ณ ๋ฅด๋ ๊ฑด ์กฐํฉ์ผ๋ก ์๊ฐํ ์ ์๋ค.
- 64N3์ด ์ต๋ ๊ฐ๋ฅ ๊ฒฝ์ฐ์ ์์ด๋ฏ๋ก ๊ทธ๋ฆฌ ํฌ์ง ์๋ค.
- ๊ณจ๋ผ์ง 3๊ฐ์ ๋ฒฝ์ map์ ๋ฐ์ํ๊ณ ๋
์ด ํผ์ง๋ ๊ฒ์ ๋ณด๋ ๊ฒ์ BFS๋ก ๋ฐ์ํ ์ ์๋ค.
- dfs๋ ๊ฐ๋ฅํ๋ค.
์ฝ๋
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring> // memcpy์ ์ํด ํ์
using namespace std;
int N, M;
int map[8][8];
vector<pair<int, int>> candid;
vector<pair<int, int>> poision;
int direction[4][2] = { {0,-1},{0,1},{1,0},{-1,0} };
int calArea(vector<pair<int,int>>& toWall) {
queue<pair<int,int>> que;
int map_copy[8][8]; memcpy(map_copy, map, sizeof(map)); // ๊ธฐ์กด ๋งต ๋ณต์ฌํด์ ์ฌ์ฉ
for (int i = 0; i < toWall.size(); i++) {
auto tmp = toWall[i];
map_copy[tmp.first][tmp.second] = 1; // ๋ฒฝ ์ถ๊ฐํ๊ธฐ
}
for (int i = 0; i < poision.size(); i++) // ๋
์์น ์ ์ฅ
que.push(poision[i]);
while (!que.empty()) {
pair<int, int> pos = que.front(); que.pop();
for (int i = 0; i < 4; i++) {
int x = pos.first + direction[i][0];
int y = pos.second + direction[i][1];
if (x < 0 || y < 0 || x >= N || y>=M)
continue;
if (map_copy[x][y] != 0)
continue;
// ์์น๊ฐ ๋งต ์์ ์๋ 0์ด๋ฉด 2๋ก ๋ง๋ค๊ธฐ
map_copy[x][y] = 2;
que.push(make_pair(x, y));
}
}
// ์์ ๊ตฌ์ญ ์ธ๊ธฐ
int res = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map_copy[i][j] == 0)
res++;
}
}
return res;
}
int maxArea() {
// ์ต๋ ์์ ๊ตฌ์ญ์ ์ฐพ๋ ํจ์
int area = -1; // ์์ ๊ตฌ์ญ
int size = candid.size();
vector<int> zeroOne(size); // 0,1๋ก ๊ตฌ์ฑ๋์ด์๋ ์กฐํฉ์ ์ํ ์์ ๋ฒกํฐ
for (int i = size-1; i >= size-3; i--) {
// ๋ค์์๋ถํฐ ๋ง๋ค์ด์ผ next_permutation์ด ์ ๋๋ก ๋์
zeroOne[i] = 1; // 3๊ฐ 1๋ก ๋ง๋ค๊ธฐ
}
do {
vector<pair<int, int>> toWall;
for (int i = 0; i < size; i++) {
if (zeroOne[i] == 1) {
toWall.push_back(candid[i]); // ํ๋ณด ์ค ๋ฒฝ์ด ๋ ๊ฒ ๊ณ ๋ฅด๊ธฐ
}
}
area = max(calArea(toWall), area); // ์ต๋ ์์ ๊ตฌ์ญ ๊ตฌํ๊ธฐ
} while (next_permutation(zeroOne.begin(), zeroOne.end()));
return area;
}
int main() {
// 9์ 20๋ถ ์์ => 10์ 20๋ถ ๋
// ์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ
// ์
๋ ฅ => ์์
cin >> N >> M;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> map[i][j];
if (map[i][j] == 0) {
candid.push_back(make_pair(i, j)); // ๋ฒฝ ํ๋ณด ์ ์ฅ (0)
}else if (map[i][j] == 2) {
poision.push_back(make_pair(i, j)); // ๋
์ ์ฅ (2)
}
}
}
cout << maxArea() << '\n';
}
๊ธฐ์ตํด๋ ๊ฒ
- memcpy(copy๋ vector, copyํ vector, ์ฌ์ด์ฆ);
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] BOJ 1987 :: ์ํ๋ฒณ (0) | 2021.04.28 |
---|---|
[c++] BOJ 10026 :: ์ ๋ก์์ฝ (0) | 2021.04.23 |
[c++] BOJ 1238 :: ํํฐ (0) | 2021.04.21 |
[c++] BOJ 1916 :: ์ต์๋น์ฉ ๊ตฌํ๊ธฐ (0) | 2021.04.12 |
[c++] BOJ 1915 :: ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2021.04.12 |
Comment