문제링크 : https://www.acmicpc.net/problem/2468
#include <bits/stdc++.h>
using namespace std;
int arr[102][102];
bool check[102][102];
int n,cnt, mh=-1;
int result = 0;
int dx[] = { -1,1,0,0 };
int dy[] = { 0,0,-1,1 };
queue<pair<int, int>>q;
void bfs(int x, int y)
{
check[x][y] = 1;
q.push({ x,y });
while (!q.empty())
{
int xx = q.front().first, yy = q.front().second; q.pop();
for (int i = 0; i < 4; i++)
{
int nx = xx + dx[i]; //다음 x 값
int ny = yy + dy[i]; //다음 y 값
if (nx < 0 || ny < 0 || nx >=n || ny >=n) { continue; } //범위 조건
if (check[nx][ny] == 0) //다음 좌표가 잠기지 않았음
{
check[nx][ny] = 1; //탐색했으므로 방문 처리(잠겼음으로 처리)
q.push({ nx,ny });
}
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> arr[i][j];
if (arr[i][j] > mh) { mh = arr[i][j]; } //최대 높이 설정
}
}
for (int k = 0; k < mh; k++)
{
cnt = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (arr[i][j] <= k) { check[i][j] = 1; } //잠겼으면 1
else { check[i][j] = 0; } //잠기지 않았으면 0
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (check[i][j] == 0) //잠기지 않았으므로 bfs 시작
{
bfs(i, j);
cnt++;
}
}
}
result = max(result, cnt);
}
cout << result;
return 0;
}
잠긴 구역을 방문 처리을 배열에서 같은 값으로 처리했다. (잠겼으면 1 == 방문했으면 1)
잠기지 않은 구역에서 시작하여 bfs탐색을 돌아서 구역을 확인후 카운트(구역 갯수) 증가시킨다.
'백준 > 실버' 카테고리의 다른 글
[백준 17086번] 아기 상어 2 (C++) (0) | 2023.02.06 |
---|---|
[백준 5014번] 스타트링크 (C++) (0) | 2023.02.06 |
[백준 2583번] 영역 구하기 (C++) (0) | 2023.02.05 |
[백준 1890번] 점프 (C++) (0) | 2023.02.05 |
[백준 1051번] 숫자 정사각형 (C++) (0) | 2023.02.05 |