※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2468번 문제인 안전 영역이다.
문제는 아래 링크를 확인하자.

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

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

잘 생각해보면, 높이가 1보다 큰 지점들과 그런 지점들을 잇는 에지만으로 이루어진 그래프의 component의 개수의 최댓값을 구하는 문제이다. N과 지점의 높이의 크기제한이 작으므로, 각 높이제한에 대하여 component의 개수를 각각 세어보는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

short arr[100][100];
int visited[100][100];

int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N; cin >> N;
	for (int r = 0; r < N; r++) {
		for (int c = 0; c < N; c++) cin >> arr[r][c];
	}

	int ans = 1;
	for (int h = 2; h <= 100; h++) {
		int cnt = 0;
		memset(visited, 0, sizeof(visited));
		for (int r = 0; r < N; r++) {
			for (int c = 0; c < N; c++) {
				if (visited[r][c]) continue;
				if (arr[r][c] < h) {
					visited[r][c] = 1;
					continue;
				}
				cnt++;
				visited[r][c] = 1;
				queue<pair<int, int>> que; que.push({ r,c });
				while (!que.empty()) {
					int curr = que.front().first, curc = que.front().second; que.pop();
					for (int i = 0; i < 4; i++) {
						int rr = curr + dr[i], cc = curc + dc[i];
						if (rr < 0 || rr >= N || cc < 0 || cc >= N) continue;
						if (visited[rr][cc]) continue;
						visited[rr][cc] = 1;
						if (arr[rr][cc] < h) continue;
						que.push({ rr,cc });
					}
				}
			}
		}
		ans = max(ans, cnt);
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 5913 // C++] 준규와 사과  (0) 2021.10.08
[BOJ 11062 // C++] 카드 게임  (0) 2021.10.07
[BOJ 16434 // C++] 드래곤 앤 던전  (0) 2021.10.05
[BOJ 2565 // C++] 전깃줄  (0) 2021.10.04
[BOJ 5557 // C++] 1학년  (0) 2021.10.03

+ Recent posts