Skip to content

Commit

Permalink
Merge pull request #39 from AlgoLeadMe/11-suhyun113
Browse files Browse the repository at this point in the history
11-suhyun113
  • Loading branch information
suhyun113 authored Aug 19, 2024
2 parents b1afacd + b9621c6 commit 3531374
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 1 deletion.
3 changes: 2 additions & 1 deletion suhyun113/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
| 7차시 | 2024.05.09 | 트리 | [원숭이 매달기](https://www.acmicpc.net/problem/2716) | [#31](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/31) |
| 8차시 | 2024.05.14 | 수학 | [어린 왕자](https://www.acmicpc.net/problem/1004) | [#32](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/32) |
| 9차시 | 2024.05.28 | 다익스트라 | [최소비용 구하기](https://www.acmicpc.net/problem/1916) | [#33](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/33) |
| 10차시 | 2024.07.13 | 플로이드-워셜 | [플로이드](https://www.acmicpc.net/problem/11404) | [#36](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/36) |
| 10차시 | 2024.07.13 | 플로이드-워셜 | [플로이드](https://www.acmicpc.net/problem/11404) | [#36](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/36) |
| 11차시 | 2024.07.16 | BFS | [연구소](https://www.acmicpc.net/problem/14502) | [#39](https://github.com/AlgoLeadMe/AlgoLeadMe-10/pull/39) |
106 changes: 106 additions & 0 deletions suhyun113/구현/11-suhyun113.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
//14502 : 연구소

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

// 메크로 설정
#define BLANK 0
#define WALL 1
#define VIRUS 2

int N, M; // 지도의 세로 크기, 가로 크기
vector<vector<int>> initial_map; // 초기 지도
vector<pair<int, int>> blank_map; // 빈 칸
int directions[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; // 방향

// 가능한 모든 벽 세우기 조합 구하기
vector<vector<pair<int, int>>> building_walls() {
vector<vector<pair<int, int>>> combinations;
int size = blank_map.size(); // 빈 칸 크기
for (int i = 0; i < size; i++) {
for (int j = i + 1; j < size; j++) {
for (int k = j + 1; k < size; k++) {
// 빈 칸에 벽 3개 세우기
combinations.push_back({blank_map[i], blank_map[j], blank_map[k]});
}
}
}
return combinations;
}

// 너비 우선 탐색(바이러스인 칸 큐에 저장 후,
// 바이러스 칸 주변 칸이 바이러스 아닌 빈 칸이라면,
// 주변 칸을 바이러스로 바꾸기)
void bfs(vector<vector<int>>& map_copy) {
queue<pair<int, int>> q;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map_copy[i][j] == VIRUS) {
q.push({i, j});
}
}
}
// 바이러스인 칸이 아니고 빈 칸이라면,
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
q.pop();
for (int d = 0; d < 4; d++) { // 방향 탐색
int nx = x + directions[d][0];
int ny = y + directions[d][1];
if (nx >= 0 && nx < N && ny >= 0 && ny < M && map_copy[nx][ny] == 0) {
map_copy[nx][ny] = VIRUS; // 빈 칸을 바이러스로 바꾸기
q.push({nx, ny});
}
}
}
}

// 안전 영역 크기 계산 함수
int calculate_safe_area(vector<vector<int>>& map_copy) {
int safe_area = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (map_copy[i][j] == BLANK) { // 빈 칸의 개수
safe_area++;
}
}
}
return safe_area;
}

int main() {
cin >> N >> M;
initial_map.resize(N, vector<int>(M));

for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> initial_map[i][j];
if (initial_map[i][j] == BLANK) {
blank_map.push_back({ i, j }); // 빈 칸 지도 생성
}
}
}

vector<vector<pair<int, int>>> wall_combinations = building_walls(); // 빈 칸에 벽 세우기
int max_safe_area = 0; // 안전 영역의 최대 크기

for (const auto& walls : wall_combinations) { // 벽 3개를 세운 여러 조합 반복
// 초기 맵 복사해서 그 맵에 벽 3개 세우는 여러 조합 중 한 경우 적용
vector<vector<int>> map_copy = initial_map;
for (const auto& wall : walls) { // 한 경우에서 세운 벽 3개의 각각 위치에 벽 세우기
map_copy[wall.first][wall.second] = WALL; // 벽 세우기
}

bfs(map_copy); // 바이러스 주변 칸 빈 칸이라면 바이러스 번짐

int safe_area = calculate_safe_area(map_copy); // 안전영역 크기 계산
max_safe_area = max(max_safe_area, safe_area);
}

cout << max_safe_area << endl;
return 0;
}

0 comments on commit 3531374

Please sign in to comment.