본문 바로가기

[백준] 1926 그림

@cayman0312026. 1. 13. 08:45

 

풀이

#include <bits/stdc++.h>
using namespace std;

int board[502][502];
bool vis[502][502];

int n, m;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> board[i][j];
        }
    }

    int num = 0;
    int mx = 0;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (vis[i][j] || board[i][j] == 0) continue;
            num++;
            queue<pair<int, int>> q;
            vis[i][j] = 1;
            q.push({i,j});
            int area = 0;
            while (!q.empty()) {
                area++;
                pair<int,int> cur = q.front(); q.pop();
                for (int dir = 0; dir < 4; dir++) {
                    int nx = cur.first + dx[dir];
                    int ny = cur.second + dy[dir];
                    if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
                    if (vis[nx][ny] || board[nx][ny] == 0) continue;
                    vis[nx][ny] = 1;
                    q.push({nx,ny});
                }
            }
            mx = max(mx, area);
        }
    }

    cout << num << "\n" << mx;

    return 0;
}

 

BFS의 기본적인 문제중 하나이다.

2차원 배열에서 그림(1로 이루어진 덩어리)가 몇개 있는지, 그림 중 가장 넓은 그림(칸 수가 가장 큰 그림)의 넓이를 구하면된다.

 

그림이 몇개가 있는지를 구하는법은 단순히 `pop()`을 할때마다 카운트를 증가시켜 구하면되고, 그림 중 가장 넓은 그림의 넓이를 구하기 위해서 이중 반복문을 돌며 배열의 칸의 위치를 옮겨가며 BFS를 돌지않은 새로운 그림이 나타나면 그 그림의 위치에서 BFS를 돌며 그림의 넓이를 측정하여(칸 수) 최종적으로 어떤 값이 가장 큰 값인지를 구하여 풀면된다.

'Memo > PS' 카테고리의 다른 글

[백준] 2178 미로탐색  (0) 2026.01.14
[백준] 1021 회전하는 큐  (0) 2026.01.07
[백준] 1316 그룹 단어 체커  (0) 2026.01.01
[백준] 2941 크로아티아 알파벳  (0) 2025.12.31
[백준] 1406 에디터  (0) 2025.12.23
cayman031
@cayman031 :: 그누로그

목차