• 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)

๋‹ค์ฐจ์› ๋ฐฐ์—ด์—์„œ ๊ฐ ์นธ์„ ๋ฐฉ๋ฌธํ•  ๋•Œ ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋น ์ง์—†์ด ๋ฐฉ๋ฌธํ•  ๋•Œ ๋„ˆ๋น„๋ฅผ ์šฐ์„ ์œผ๋กœ ๋ฐฉ๋ฌธํ•œ๋‹ค.

๊ตฌํ˜„ ๊ณผ์ •
  1. ์‹œ์ž‘ํ•˜๋Š” ์นธ์„ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด ํ•ด๋‹น ์›์†Œ์˜ ์นธ์˜ ์ƒํ•˜์ขŒ์šฐ ์นธ์— ๋Œ€ํ•ด 3๋ฒˆ์„ ์ง„ํ–‰ํ•œ๋‹ค.
  3. ํ•ด๋‹น ์นธ์„ ์ด์ „์— ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด passํ•˜๊ณ  ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•˜๋ฉด ๋ฐฉ๋ฌธํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ๋‚จ๊ธฐ๊ณ  ํ์— ์‚ฝ์ž…ํ•œ๋‹ค.
  4. ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ 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;
}