본문 바로가기

algorithm

백준 2468번 안전 영역

https://www.acmicpc.net/problem/2468

 

아이디어:

1. BFS 순환에 조건 추가

2. 1~100 순환보다 더 적게하기 위해 높이 중 최소값과 최대값을 구하여 그 사이에서 순환

3. board[i][j] <= k (임의의 높이) && vis[i][j] < 1인 { i, j }를 큐에 삽입하면서 영역 개수를 카운트하고 BFS 수행

4. 영역 개수의 최대값을 출력

 

#include <iostream>
#include <bits/stdc++.h>

using namespace std;

int board[101][101];
int vis[101][101];
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };

int main() {

	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	queue<pair<int, int>> Q;
	
	int n, tmp, ans = 0, maxi = 0, mini = 100;
	cin >> n;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board[i][j];
			maxi = max(board[i][j], maxi);
			mini = min(board[i][j], mini);
		}
	}

	for (int k = mini; k <= maxi; k++) {
		tmp = 0;
		for (int i = 0; i < 101; i++) {
			fill(vis[i], vis[i] + 101, 0);
		}

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				if (board[i][j] >= k && vis[i][j] < 1) {
					vis[i][j] = 1;
					Q.push({ i, j });
					tmp++;
				}

				while (!Q.empty()) {
					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 >= n) continue;
						if (board[nx][ny] < k || vis[nx][ny] != 0) continue;
						vis[nx][ny] = 1;
						Q.push({ nx, ny });
					}
				}
			}
		}
		ans = max(tmp, ans);
	}

	cout << ans;

	return 0;

}

'algorithm' 카테고리의 다른 글

백준 6593번 상범 빌딩  (0) 2025.05.07
백준 5014번 스타트링크  (0) 2025.04.27
백준 2583번 영역 구하기  (0) 2025.04.12
백준 5427번 불  (0) 2025.04.12
백준 7562번 나이트의 이동  (0) 2025.04.12