STUDY/Algorithm

[백준] 3184 양 python

sinawi95 2022. 2. 8. 12:40
728x90

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

 

3184번: 양

첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.

www.acmicpc.net

그래프 탐색을 활용하는 문제이다. BFS 로 이차원배열을 탐색했고 해당 구역에서 양과 늑대의 수를 확인한다음 한쪽 값만 내보내는 방식으로 진행했다.

# import sys; input = sys.stdin.readline
from collections import deque
def bfs(i, j, _map, visit):
    global n, m
    ret = [0, 0]
    q = deque()
    q.append((i, j))
    while q:
        r, c = q.popleft()
        if visit[r][c]: continue
        visit[r][c] = 1
        if _map[r][c] == 'o':
            ret[0] += 1
        elif _map[r][c] == 'v':
            ret[1] += 1
        for dr, dc in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
            nr, nc = r + dr, c + dc
            if 0 > nr or nr >= n or 0 > nc or nc >= m: continue
            if _map[nr][nc] == '#': continue
            q.append((nr, nc))

    if ret[0] > ret[1]:
        ret[1] = 0
    else:
        ret[0] = 0

    return ret

def main():
    global n, m
    n, m = map(int, input().split())
    _map = [list(input().rstrip()) for _ in range(n)]
    visit = [[0 for _ in range(m)] for _ in range(n)]
    answer = [0, 0]
    for i in range(n):
        for j in range(m):
            if _map[i][j] == '#': continue
            if visit[i][j]: continue
            ret_val = bfs(i, j, _map, visit)
            answer[0] += ret_val[0]
            answer[1] += ret_val[1]
    print(*answer)

if __name__ == "__main__":
    main()

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 20207 달력 python  (0) 2022.02.10
[백준] 18222 투에-모스 문자열 python  (0) 2022.02.09
[백준] 13549 숨바꼭질 3 python  (0) 2022.02.07
[백준] 2407 조합 python  (0) 2022.02.07
[백준] 9421 소수상근수 python  (0) 2022.02.06