그림
관련 개념
#BFS #플러드 필
문제
📌 1 단계 : 문제 분석하기
- 해당 문제는 연결된 1들을 찾으면 되는 문제이다.
- 연결된 1을 찾기 위해서는 BFS를 활용 할 수 있다.
- 왜 BFS를 써야 할까? → 연결된 1을 찾기 위해서는 인접한 칸들을 계속 방문하면서 면적을 계산해야 함. 이러한 이유로 BFS를 쓴다.
📌 2 단계 : 손으로 풀어보기
- 0 혹은 이미 방문한 1은 BFS를 시작하지 않는다
- 그 이외의 1들을 BFS를 시작해서 면적을 계산한다
📌 3 단계 : 슈도 코드 작성하기
📌 4 단계 : 코드 작성하기
#include <iostream>
#include <string>
#include <vector>
#include <climits>
#include <queue>
#include <numeric>
#include <algorithm>
#include <set>
#include <tuple>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
int n, m;
int count = 0;
int ans = 0;
cin >> n >> m;
vector<vector<int>> arr(n, vector<int>(m, 0));
vector<vector<bool>> visited(n, vector<bool>(m, false));
for(int i = 0; i < n; i++){
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
// 0이나 이미 방문했으면 패스
if (arr[i][j] == 0 || visited[i][j]) continue;
queue<pair<int, int>> q;
count++;
// 면적
int size = 1;
q.push({ i , j });
// 이런 디테일 주의!
visited[i][j] = true;
while (!q.empty()) {
int cur_x = q.front().first;
int cur_y = q.front().second;
q.pop();
for (int k = 0; k < 4; k++) {
int next_x = cur_x + dx[k];
int next_y = cur_y + dy[k];
// 범위 안
if (next_x >= 0 && next_x < n && next_y >= 0 && next_y < m) {
if (arr[next_x][next_y] == 1 && !visited[next_x][next_y]) {
size++;
visited[next_x][next_y] = true;
q.push({ next_x, next_y });
}
}
}
}
ans = max(ans, size);
}
}
cout << count << "\n" << ans;
return 0;
}
// 처음에는 오른쪽에서 왼쪽으로 진행하면서, 오른쪽 아래만 큐에 넣으면 된다고
// 생각했는데, 예외 케이스가 있었음!! 항상 예외 케이스 생각하기📌 5 단계 : 배운점
- 처음에는 오른쪽에서 왼쪽으로 진행하면서, 오른쪽 아래만 큐에 넣으면 된다고생각했는데, 예외 케이스가 있었음!! 항상 예외 케이스 생각하기
- 그리고 계속 면적이 1 크게 계산되어서 이상하다 생각했는데, 시작 노드를 방문처리를 안한거였음