※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1743번 문제인 음식물 피하기이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1743
1743번: 음식물 피하기
첫째 줄에 통로의 세로 길이 N(1 ≤ N ≤ 100)과 가로 길이 M(1 ≤ M ≤ 100) 그리고 음식물 쓰레기의 개수 K(1 ≤ K ≤ N×M)이 주어진다. 그리고 다음 K개의 줄에 음식물이 떨어진 좌표 (r, c)가 주어진다
www.acmicpc.net
주어진 2차원배열에서 가장 크게 뭉친 쓰레기 덩어리를 찾는 문제이다.
BFS 등의 알고리즘을 이용하여 가장 큰 connected component의 크기를 구해주자.
아래의 dr, dc 배열 등을 이용하면 조금 더 구현을 편하게 할 수 있다.
또한 셌던 덩어리를 또다시 셀 필요는 없으므로 visited 배열을 관리하여 중복된 탐색을 건너뛰자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool visited[100][100];
bool board[100][100];
int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };
int main() {
int R, C, N; cin >> R >> C >> N;
while (N--) {
int r, c; cin >> r >> c; r--; c--;
board[r][c] = 1;
}
int ans = 0;
for (int r = 0; r < R; r++) {
for (int c = 0; c < C; c++) {
if (visited[r][c] || board[r][c] == 0) continue;
queue<pair<int, int>> que;
que.push(make_pair(r, c));
int cnt = 0;
visited[r][c] = 1;
while (!que.empty()) {
cnt++;
int x = que.front().first, y = que.front().second; que.pop();
for (int k = 0; k < 4; k++) {
int rr = x + dr[k], cc = y + dc[k];
if (rr < 0 || rr >= R || cc < 0 || cc >= C) continue;
if (board[rr][cc] && visited[rr][cc] == 0) {
visited[rr][cc] = 1;
que.push(make_pair(rr, cc));
}
}
}
ans = max(ans, cnt);
}
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 11049 // C++] 행렬 곱셈 순서 (0) | 2021.12.22 |
---|---|
[BOJ 3673 // C++] 나눌 수 있는 부분 수열 (0) | 2021.12.21 |
[BOJ 5567 // C++] 결혼식 (0) | 2021.12.19 |
[BOJ 16306 // C++] Cardboard Container (0) | 2021.12.18 |
[BOJ 13271 // C++] 스파이 (0) | 2021.12.17 |