์ฒซ์งธ ์ค์ ๋ํ์ง์ ์ธ๋ก ํฌ๊ธฐ n(1 โค n โค 500)๊ณผ ๊ฐ๋ก ํฌ๊ธฐ m(1 โค m โค 500)์ด ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ n+1 ์ค ๊น์ง ๊ทธ๋ฆผ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. (๋จ ๊ทธ๋ฆผ์ ์ ๋ณด๋ 0๊ณผ 1์ด ๊ณต๋ฐฑ์ ๋๊ณ ์ฃผ์ด์ง๋ฉฐ, 0์ ์์น ์ด ์๋ ๋ถ๋ถ, 1์ ์์น ์ด ๋ ๋ถ๋ถ์ ์๋ฏธํ๋ค)
์ฒซ์งธ ์ค์ ๋ํ์ง์ ์ธ๋ก ํฌ๊ธฐ n(1 โค n โค 500)๊ณผ ๊ฐ๋ก ํฌ๊ธฐ m(1 โค m โค 500)์ด ์ฐจ๋ก๋ก ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ n+1 ์ค ๊น์ง ๊ทธ๋ฆผ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. (๋จ ๊ทธ๋ฆผ์ ์ ๋ณด๋ 0๊ณผ 1์ด ๊ณต๋ฐฑ์ ๋๊ณ ์ฃผ์ด์ง๋ฉฐ, 0์ ์์น ์ด ์๋ ๋ถ๋ถ, 1์ ์์น ์ด ๋ ๋ถ๋ถ์ ์๋ฏธํ๋ค)
์ฒซ์งธ ์ค์๋ ๊ทธ๋ฆผ์ ๊ฐ์, ๋์งธ ์ค์๋ ๊ทธ ์ค ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ฅผ ์ถ๋ ฅํ์ฌ๋ผ. ๋จ, ๊ทธ๋ฆผ์ด ํ๋๋ ์๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋์ ๊ทธ๋ฆผ์ ๋์ด๋ 0์ด๋ค.
- n,m๊ณผ board๋ฐฐ์ด ์ ๋ ฅ
- ๊ทธ๋ฆผ์ด ์๋๊ฑฐ๋(board[i][j] == 0) ๋ฐฉ๋ฌธํ ์ ์์ ๋(isVisit[i][j] == 1) โ
continue
- ๋ฐฉ๋ฌธํ์ง ์์ ๊ทธ๋ฆผ์ผ ๋
picNum++;
โ ์ํ์ข์ฐ ๋์ด์ ์ฐ๊ฒฐ๋ ๊ฒ์ด ์๋ ๋ฒ์๊น์ง๊ฐ ๊ทธ๋ฆผ์queue
๋ฅผ ๋ง๋ค์ด์ ๋ฐฉ๋ฌธํ์ง ์์ ์ขํ๋ค์ ๋ด๋๋ค.queue
์ ์ฝ์ ํ๋ค๋ฉดisVisit
์ ํด๋น ์ขํ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.- ์ต์ ์ขํ๋ฅผ ๊บผ๋ธ ํ, ํ์์ ์ญ์ ํ๋ค.
- ์ต์ ์ขํ์ ์ํ์ข์ฐ๋ฅผ ๋๋ฉฐ, ๋ฐฉ๋ฌธํ์ง ์์ ๊ทธ๋ฆผ์ ์ขํ๋ฅผ ํ์ ์ฝ์ ํ๋ค.
- ํ๊ฐ ์ ๋ถ ๋น ๋ ๊น์ง ๋ฐ๋ณต
#include<bits/stdc++.h>
using namespace std;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int board[502][502];
bool isVisit[502][502];
int n, m;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
cin >> board[i][j];
}
}
int picNum = 0; // ๊ทธ๋ฆผ์ ์
int maxPic = 0; // ๊ทธ๋ฆผ ์ต๋๊ฐ
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
// ๊ทธ๋ฆผ์ด ์๋๊ฑฐ๋ ๋ฐฉ๋ฌธํ ์ ์๋ ๊ฒฝ์ฐ
if(board[i][j] == 0 || isVisit[i][j]) continue;
picNum++;
queue<pair<int, int>> q;
isVisit[i][j] = 1;
q.push({i, j});
int area = 0; // ๊ทธ๋ฆผ์ ๋์ด
// ์ธ์ ์นธ์ ๋ค ๋ ๋ ๊น์ง
while(!q.empty()) {
area++;
pair<int, int> current = q.front();
q.pop();
for(int dir=0;dir<4;dir++) {
int nearX = current.first + dx[dir];
int nearY = current.second + dy[dir];
if(nearX < 0 || nearX >=n || nearY <0 || nearY >=m) continue;
if(isVisit[nearX][nearY] || board[nearX][nearY]!=1) continue;
isVisit[nearX][nearY] = 1;
q.push({nearX, nearY});
}
}
// (i, j) ๋ฅผ ์์์ ์ผ๋ก ํ๋ BFS ์ข
๋ฃ
maxPic = max(maxPic, area);
}
}
cout << picNum << "\\n" << maxPic;
return 0;
}