- toc {:toc}
๋ฌธ์
์ด๋ค ํฐ ๋ํ์ง์ ๊ทธ๋ฆผ์ด ๊ทธ๋ ค์ ธ ์์ ๋, ๊ทธ ๊ทธ๋ฆผ์ ๊ฐ์์, ๊ทธ ๊ทธ๋ฆผ ์ค ๋์ด๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ. ๋จ, ๊ทธ๋ฆผ์ด๋ผ๋ ๊ฒ์ 1๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ํ ๊ทธ๋ฆผ์ด๋ผ๊ณ ์ ์ํ์. ๊ฐ๋ก๋ ์ธ๋ก๋ก ์ฐ๊ฒฐ๋ ๊ฒ์ ์ฐ๊ฒฐ์ด ๋ ๊ฒ์ด๊ณ ๋๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ์ด ๋ ๊ฒ์ ๋จ์ด์ง ๊ทธ๋ฆผ์ด๋ค. ๊ทธ๋ฆผ์ ๋์ด๋ ๊ทธ๋ฆผ์ ํฌํจ๋ 1์ ๊ฐ์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ํ์ง์ ์ธ๋ก ํฌ๊ธฐ n(1 โค n โค 500)๊ณผ ๊ฐ๋ก ํฌ๊ธฐ m(1 โค m โค 500)์ด ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ n+1 ์ค ๊น์ง ๊ทธ๋ฆผ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. (๋จ ๊ทธ๋ฆผ์ ์ ๋ณด๋ 0๊ณผ 1์ด ๊ณต๋ฐฑ์ ๋๊ณ ์ฃผ์ด์ง๋ฉฐ, 0์ ์์น ์ด ์๋ ๋ถ๋ถ, 1์ ์์น ์ด ๋ ๋ถ๋ถ์ ์๋ฏธํ๋ค)
์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ๊ทธ๋ฆผ์ ๊ฐ์, ๋์งธ ์ค์๋ ๊ทธ ์ค ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ. ๋จ, ๊ทธ๋ฆผ์ด ํ๋๋ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ 0์ด๋ค.
์ถ์ฒ:https://www.acmicpc.net/problem/1926
ํ์ด
BFS (Breadth First Search)
๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ
๋น ์ง์์ด ๋ฐฉ๋ฌธํ ๋ ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ค.
๊ตฌํ ๊ณผ์
- ์์ํ๋ ์นธ์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ์๋ฅผ ํ๋ค.
- ํ์์ ์์๋ฅผ ๊บผ๋ด ํด๋น ์์์ ์นธ์ ์ํ์ข์ฐ ์นธ์ ๋ํด 3๋ฒ์ ์งํํ๋ค.
- ํด๋น ์นธ์ ์ด์ ์ ๋ฐฉ๋ฌธํ๋ค๋ฉด passํ๊ณ ์ฒ์ ๋ฐฉ๋ฌธํ๋ฉด ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊ธฐ๊ณ ํ์ ์ฝ์ ํ๋ค.
- ํ๊ฐ ๋น ๋๊น์ง 2๋ฒ์ ๋ฐ๋ณตํ๋ค.
๋ชจ๋ ์นธ์ด ํ์ 1๋ฒ์ฉ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ BFS์ ๋ํ ์๊ฐ๋ณต์ก๋๋ ์นธ์ด N๊ฐ ์ผ ๋ O(N)
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
int vis[502][502]; // ๋ฐฉ๋ฌธ ํ์ธ ๋ฐฐ์ด
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
queue<pair<int, int> > q; // 2์ฐจ์ ๋ฐฐ์ด์ด๋ฏ๋ก pair ์ฌ์ฉ
int main(){
ios::sync_with_stdio(0);
cin.tie();
int n, m, val;
int board[502][502];
cin >> n >> m;
for(int i = 0; i < n; i++){ // ๋ณด๋ํ์ ๊ฐ ์
๋ ฅ
for(int j = 0; j < m; j++){
cin >> val;
board[i][j] = val;
}
}
int cnt = 0, area = 0;
for(int row = 0; row < n; row++){
for(int col = 0; col < m; col++){
int temp = 0;
if(vis[row][col] != 0 || board[row][col] != 1) continue; // ์ด๊ธฐ๊ฐ ์ค์
vis[row][col] = 1;
q.push({row, col});
cnt++;
while(!q.empty()){ // 2~4๋ฒ ๊ณผ์
pair<int, int> cur = q.front();
q.pop();
temp++;
for(int dir = 0; dir < 4; dir++){
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if(vis[nx][ny] == 1 || board[nx][ny] != 1) continue;
vis[nx][ny] = 1;
q.push({nx, ny});
}
}
if(area < temp) area = temp;
}
}
cout << cnt << endl;
cout << area << endl;
}