chldkato

백준 3187 양치기 꿍 (파이썬) 본문

백준

백준 3187 양치기 꿍 (파이썬)

chldkato 2020. 2. 22. 14:34

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

 

3187번: 양치기 꿍

문제 양치기 꿍은 맨날 늑대가 나타났다고 마을 사람들을 속였지만 이젠 더이상 마을 사람들이 속지 않는다. 화가 난 꿍은 복수심에 불타 아예 늑대들을 양들이 있는 울타리안에 마구 집어넣어 양들을 잡아먹게 했다. 하지만 양들은 보통 양들이 아니다. 같은 울타리 영역 안의 양들의 숫자가 늑대의 숫자보다 더 많을 경우 늑대가 전부 잡아먹힌다. 물론 그 외의 경우는 양이 전부 잡아먹히겠지만 말이다. 꿍은 워낙 똑똑했기 때문에 이들의 결과는 이미 알고있다. 만약 빈

www.acmicpc.net

1. 주어진 지도를 탐색하면서 울타리가 아니면 bfs에 입력한다

2. 범위 안에 양과 늑대의 수를 카운트하고 양이 늑대보다 많으면 늑대를 0으로 그 외는 양을 0으로 한다

3. 저장한 늑대와 양의 수 출력

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
    v_cnt, k_cnt = 0, 0
    while q:
        x, y = q.popleft()
        if a[x][y] == 'v':
            v_cnt += 1
        elif a[x][y] == 'k':
            k_cnt += 1
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < m and 0 <= ny < n:
                if a[nx][ny] != '#' and not c[nx][ny]:
                    c[nx][ny] = 1
                    q.append([nx, ny])

    if v_cnt >= k_cnt:
        k_cnt = 0
    else:
        v_cnt = 0
    return [v_cnt, k_cnt]

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

v, k = 0, 0
for i in range(m):
    for j in range(n):
        if a[i][j] != '#' and not c[i][j]:
            v_cnt, k_cnt = bfs(i, j)
            v += v_cnt; k += k_cnt
print(k, v)

'백준' 카테고리의 다른 글

백준 2933 미네랄 (파이썬)  (0) 2020.02.23
백준 9376 탈옥 (파이썬)  (0) 2020.02.22
백준 12761 돌다리 (파이썬)  (0) 2020.02.22
백준 3197 백조의 호수 (파이썬)  (0) 2020.02.21
백준 5214 환승 (파이썬)  (0) 2020.02.21
Comments