※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |