chldkato

백준 3184 양 (파이썬) 본문

백준

백준 3184 양 (파이썬)

chldkato 2020. 2. 18. 15:08

https://www.acmicpc.net/problem/3184

 

3184번: 양

문제 미키의 뒷마당에는 특정 수의 양이 있다. 그가 푹 잠든 사이에 배고픈 늑대는 마당에 들어와 양을 공격했다. 마당은 행과 열로 이루어진 직사각형 모양이다. 글자 '.' (점)은 빈 필드를 의미하며, 글자 '#'는 울타리를, 'o'는 양, 'v'는 늑대를 의미한다. 한 칸에서 수평, 수직만으로 이동하며 울타리를 지나지 않고 다른 칸으로 이동할 수 있다면, 두 칸은 같은 영역 안에 속해 있다고 한다. 마당에서 "탈출"할 수 있는 칸은 어떤 영역에도 속하지

www.acmicpc.net

1. 벽이 아니면 bfs를 실행

2. bfs로 벽이 아닐 경우에 이동하면서 늑대나 양의 좌표가 불러와지면 각각 vq와 oq에 저장

3. vq, oq의 길이를 비교하여 늑대나 양을 지운다

4. 늑대와 양의 개수를 세서 출력

from collections import deque
import sys

input = sys.stdin.readline
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

def bfs(x, y):
    q.append([x, y])
    c[x][y] = 1
    vq, oq = [], []
    while q:
        x, y = q.popleft()
        if a[x][y] == 'v':
            vq.append([x, y])
        elif a[x][y] == 'o':
            oq.append([x, y])
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m:
                if a[nx][ny] != '#' and c[nx][ny] == 0:
                    c[nx][ny] = 1
                    q.append([nx, ny])

    if len(vq) >= len(oq):
        for i in oq:
            a[i[0]][i[1]] = '.'
    else:
        for i in vq:
            a[i[0]][i[1]] = '.'

n, m = map(int, input().split())
a = [list(map(str, input().strip())) for _ in range(n)]
c = [[0]*m for _ in range(n)]
q = deque()

for i in range(n):
    for j in range(m):
        if a[i][j] != '#' and c[i][j] == 0:
            bfs(i, j)

ocnt, vcnt = 0, 0
for i in range(n):
    for j in range(m):
        if a[i][j] == 'o':
            ocnt += 1
        elif a[i][j] == 'v':
            vcnt += 1
print(ocnt, vcnt)

Comments