BOJ 14502. ์ฐ๊ตฌ์
๐โโ๏ธ[Gold IV] ์ฐ๊ตฌ์ - 14502
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2024 KB, ์๊ฐ: 40 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๋ธ๋ฃจํธํฌ์ค ์๊ณ ๋ฆฌ์ฆ, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊ตฌํ
์ ์ถ ์ผ์
2023๋ 12์ 21์ผ 23:49:24
๋ฌธ์ ์ค๋ช
์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง๊ธฐ ์ํด์ ์ฐ๊ตฌ์์ ๋ฒฝ์ ์ธ์ฐ๋ ค๊ณ ํ๋ค.
์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ 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์ด๋ค.
์ฐ๊ตฌ์์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋ ์ป์ ์ ์๋ ์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง๋์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (3 โค N, M โค 8)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ง๋์ ๋ชจ์์ด ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์์น์ด๋ค. 2์ ๊ฐ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
๋น ์นธ์ ๊ฐ์๋ 3๊ฐ ์ด์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ป์ ์ ์๋ ์์ ์์ญ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋ก์ง์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- 3๊ฐ์ ๋ฒฝ์ ์ธ์ด๋ค.
- ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ค.
- ์์ ํ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
๊ตฌํ์ ํ๊ธฐ ์ ์ธํ ๋ถํฐํ๋ค.
// 0 : ๋น ์นธ
// 1 : ๋ฒฝ
// 2 : ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์์น
void setting()
{
cin >> n >> m;
board = vector<vector<int>>(n, vector<int>(m));
for (int y = 0; y < n; ++y)
{
for (int x = 0; x < m; ++x)
{
cin >> board[y][x];
if (board[y][x] == 0) // ๋ฒฝ์ ์ธ์ธ์ ์๋ ๊ณต๊ฐ์ด๋ ๋ป.
wall.push_back({ y, x });
if (board[y][x] == 2)
virus.push_back({ y, x });
}
}
}
์ ๋ ๊ฒ ์ธํ
์ ํ๊ณ ์ด์ ๊ตฌํ์ ํ๋๋ฐ 3๊ฐ์ ๋ฒฝ์ ์ธ์ฐ๋ ๊ฑด combination์ด๋ค.
combinationํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ 3๊ฐ๋ 3์ค for๋ฌธ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
void solve()
{
int res = 0;
// ๋ฒฝ์ ๋ง๋ ๋ค.
// ์กฐํฉ
int wallSize = wall.size();
for (int i = 0; i < wallSize; ++i)
{
for (int j = 0; j < i; ++j)
{
for (int k = 0; k < j; ++k)
{
// 3๊ฐ์ ๋ฒฝ์ ์ธ์ด๋ค.
board[wall[i].y][wall[i].x] = 1;
board[wall[j].y][wall[j].x] = 1;
board[wall[k].y][wall[k].x] = 1;
// ์ฌ๊ธฐ์ ๋ฐ์ด๋ฌ์ค๋ฅผ ํผ๋จ๋ฆฌ๊ณ ์์ ํ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
res = max(res, spread());
// ๋ค์ ๊ฒฝ์ฐ๋ฅผ ์ํ์ฌ ์์ ๋ณต๊ตฌ ์ํจ๋ค.
board[wall[i].y][wall[i].x] = 0;
board[wall[j].y][wall[j].x] = 0;
board[wall[k].y][wall[k].x] = 0;
}
}
}
cout << res << '\n';
}
spreadํจ์๊ฐ ์๋๋ฐ, ์ฌ๊ธฐ์ ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ ๋ก์ง์ ๊ตฌํํ๋ค.
int spread()
{
int res = 0;
memset(visited, 0, sizeof(visited));
for (Pos pos : virus)
{
visited[pos.y][pos.x] = 1;
dfs(pos.y, pos.x);
}
for (int y = 0; y < n; ++y)
for (int x = 0; x < m; ++x)
if (board[y][x] == 0 && visited[y][x] == 0)
res++;
return res;
}
spread๋ฅผ ํ ๋ ๋ง๋ค visited๋ ์ด๊ธฐํ ์์ผ์ผํ๋ค.
์ฒซ ๋ฒ์งธ for๋ฌธ์ ๋ณด๋ฉด virus ๋ฐฐ์ด์ ์ํํ๋ฉด์ dfs๋ฅผ ์ํจ๋ค.
์ฌ๊ธฐ์ ํผ์ง๋ ๋ก์ง์ด ๋๋ค.
๊ทธ ๋ก์ง์ด ๋๋๋ฉด ์๋ ์ด์คfor๋ฌธ์์ ์์ ํ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
board[y][x] == 0
๋ฟ๋ง ์๋๋ผ ๋ฐ์ด๋ฌ์ค๊ฐ ์ง๋๊ฐ ์๋ฆฌ๊ฐ ์๋ ๊ณณ์ธ visited[y][x] == 0
์ญ์ ํ์ธํด ์ฃผ์ด์ผํ๋ค.
dfs๋ ์๋์ ๊ฐ๋ค.
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void dfs(int y, int x)
{
for (int i = 0; i < 4; ++i)
{
int nextY = y + dy[i];
int nextX = x + dx[i];
if (nextY < 0 || nextX < 0 || nextY >= n || nextX >= m)
continue;
if (visited[nextY][nextX])
continue;
if (board[nextY][nextX]) // ๋ฒฝ์ธ ๊ฒฝ์ฐ
continue;
visited[nextY][nextX] = true;
dfs(nextY, nextX);
}
}
๋ฐฑ์ค์์ memset์ ๊ทธ๋ฅ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์ปดํ์ผ ์๋ฌ๋ฅผ ์๋๊ฒ ํ๋ ค๋ฉด <memory>
ํค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ <cstring>
ํค๋๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <memory>
using namespace std;
struct Pos
{
int y;
int x;
};
int visited[10][10];
int n, m;
vector<vector<int>> board;
vector<Pos> wall;
vector<Pos> virus;
// 0 : ๋น ์นธ
// 1 : ๋ฒฝ
// 2 : ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์์น
void setting()
{
cin >> n >> m;
board = vector<vector<int>>(n, vector<int>(m));
for (int y = 0; y < n; ++y)
{
for (int x = 0; x < m; ++x)
{
cin >> board[y][x];
if (board[y][x] == 0)
wall.push_back({ y, x });
if (board[y][x] == 2)
virus.push_back({ y, x });
}
}
}
// ํผ์ง๋ ํจ์
void print_board()
{
for (int y = 0; y < n; ++y)
{
for (int x = 0; x < m; ++x)
{
cout << board[y][x] << " ";
}
cout << endl;
}
cout << endl;
}
int dy[] = { -1, 0, 1, 0 };
int dx[] = { 0, 1, 0, -1 };
void dfs(int y, int x)
{
for (int i = 0; i < 4; ++i)
{
int nextY = y + dy[i];
int nextX = x + dx[i];
if (nextY < 0 || nextX < 0 || nextY >= n || nextX >= m)
continue;
if (visited[nextY][nextX])
continue;
if (board[nextY][nextX])
continue;
visited[nextY][nextX] = true;
dfs(nextY, nextX);
}
}
int spread()
{
int res = 0;
memset(visited, 0, sizeof(visited));
for (Pos pos : virus)
{
visited[pos.y][pos.x] = 1;
dfs(pos.y, pos.x);
}
for (int y = 0; y < n; ++y)
for (int x = 0; x < m; ++x)
if (board[y][x] == 0 && visited[y][x] == 0)
res++;
return res;
}
// 1. ๋ฒฝ์ 3๊ฐ ์ธ์ด๋ค
// 2. ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง๋ค.
// 3. ์์ ํ ์์ญ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ค.
void solve()
{
int res = 0;
// ๋ฒฝ์ ๋ง๋ ๋ค.
// ์กฐํฉ
int wallSize = wall.size();
for (int i = 0; i < wallSize; ++i)
{
for (int j = 0; j < i; ++j)
{
for (int k = 0; k < j; ++k)
{
board[wall[i].y][wall[i].x] = 1;
board[wall[j].y][wall[j].x] = 1;
board[wall[k].y][wall[k].x] = 1;
//print_board();
res = max(res, spread());
board[wall[i].y][wall[i].x] = 0;
board[wall[j].y][wall[j].x] = 0;
board[wall[k].y][wall[k].x] = 0;
}
}
}
cout << res << '\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
setting();
solve();
return 0;
}