프로그래밍/알고리즘

BOJ 3184 · 양

반응형


알고리즘 분류 : BFS  


남아있는 양과 늑대의 수를 구하는 문제다. 특정 지역에서 양이 늑대보다 많으면 양만 살아남고, 그렇지 않으면 늑대만 살아남는다.


  • 각 영역은 울타리('#')로 둘러싸여 있으며, 영역 내부는 BFS를 통해 탐색한다.
  • BFS 탐색을 하면서 양('o')의 수와 늑대('v')의 수를 센다.
  • 양이 늑대보다 많으면, 양만 살아남으므로 총 양의 수에 더한다.
  • 늑대가 양보다 많거나 같으면, 늑대만 살아남으므로 총 늑대의 수에 더한다.
  • 위의 과정을 모든 영역의 탐색이 끝날 때까지 진행한다.




C++ 소스코드


#include <cstdio>
#include <queue>
#include <utility>
using namespace std;

int r, c, sheep, wolf;
char a[251][251];
bool check[251][251];
const int dx[] = {-1, 0, 1, 0}, dy[] = {0, -1, 0, 1};

void bfs(int i, int j) {
    queue<pair<int, int>> q;
    q.push(make_pair(i, j));
    check[i][j] = true;
    int o = 0, v = 0;
    while (!q.empty()) {
        int x = q.front().first, y = q.front().second; q.pop();
        if (a[x][y] == 'o') o++;
        if (a[x][y] == 'v') v++;
        for (int k=0; k<4; k++) {
            int nx = x+dx[k], ny = y+dy[k];
            if (nx < 0 || nx >= r || ny < 0 || ny >= c) continue;
            if (check[nx][ny] || a[nx][ny] == '#') continue;
            q.push(make_pair(nx, ny));
            check[nx][ny] = true;
        }
    }
    if (o > v) sheep += o;
    else wolf += v;
}

int main() {
    scanf("%d %d", &r, &c);
    for (int i=0; i<r; i++) scanf("%s", a[i]);
    for (int i=0; i<r; i++) {
        for (int j=0; j<c; j++) {
            if (!check[i][j] && a[i][j] != '#') {
                bfs(i, j);
            }
        }
    }
    printf("%d %d\n", sheep, wolf);
    return 0;
}




Python 3 소스코드


from collections import deque

def bfs(i, j):
    global sheep, wolf
    q = deque()
    q.append((i, j))
    check[i][j] = True
    o, v = 0, 0
    while q:
        x, y = q.popleft()
        if a[x][y] == 'o':
            o += 1
        if a[x][y] == 'v':
            v += 1
        for dx, dy in (-1,0), (1,0), (0,-1), (0,1):
            nx, ny = x+dx, y+dy
            if nx < 0 or nx >= r or ny < 0 or ny >= c:
                continue
            if not check[nx][ny] and a[nx][ny] != '#':
                q.append((nx, ny))
                check[nx][ny] = True
    if o > v:
        sheep += o
    else:
        wolf += v

r, c = map(int, input().split())
a = [list(input().strip()) for _ in range(r)]
check = [[False]*c for _ in range(r)]
sheep, wolf = 0, 0
for i in range(r):
    for j in range(c):
        if not check[i][j] and a[i][j] != '#':
            bfs(i, j)
print("%d %d" % (sheep, wolf))




참고



반응형