반응형
알고리즘 분류 : DFS, BFS
음식물 덩어리의 최대 크기를 구하는 문제다. 간단한 플러드 필 문제이다.
- N*M 사이즈의 맵을 만들고 0으로 모두 채운다.
- 입력으로 주어지는 음식물의 위치를 맵에 1로 채운다.
- 음식물(1)을 기준으로 DFS 또는 BFS 탐색을 하여 연결된 음식물을 찾는다.
- 가장 큰 음식물을 정답으로 낸다.
C++ 소스코드
#include <cstdio> int n, m, k, ans; int a[100][100]; bool check[100][100]; const int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1}; int dfs(int x, int y) { int ret = 1; check[x][y] = true; for (int i=0; i<4; i++) { int nx = x+dx[i], ny = y+dy[i]; if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; if (!check[nx][ny] && a[nx][ny]) ret += dfs(nx, ny); } return ret; } int main() { scanf("%d %d %d", &n, &m, &k); while (k--) { int r, c; scanf("%d %d", &r, &c); a[r-1][c-1] = 1; } for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { if (!check[i][j] && a[i][j]) { int k = dfs(i, j); if (ans < k) ans = k; } } } printf("%d\n", ans); return 0; }
Python 3 소스코드
from collections import deque n, m, k = map(int, input().split()) a = [[0]*m for _ in range(n)] check = [[False]*m for _ in range(n)] ans = 0 def bfs(i, j): q = deque() q.append((i, j)) cnt = 1 check[i][j] = True while q: x, y = q.popleft() for dx, dy in (-1,0), (1,0), (0,-1), (0,1): nx, ny = x+dx, y+dy if nx < 0 or nx >= n or ny < 0 or ny >= m: continue if not check[nx][ny] and a[nx][ny]: q.append((nx, ny)) check[nx][ny] = True cnt += 1 return cnt for _ in range(k): r, c = map(int, input().split()) a[r-1][c-1] = 1 for i in range(n): for j in range(m): if not check[i][j] and a[i][j]: ans = max(ans, bfs(i, j)) print(ans)
✓ 파이썬은 BFS로 구현했다.
참고
- 백준 온라인 저지 : BOJ 1743
반응형