프로그래밍/알고리즘

BOJ 1743 · 음식물 피하기

반응형


알고리즘 분류 : 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로 구현했다.




참고



반응형