1seul357

[BOJ] 양 본문

알고리즘/백준

[BOJ] 양

1seul 2021. 12. 9. 12:52
from collections import deque

def bfs(a, b):
    global o_cnt, v_cnt
    dr = [0, 0, -1, 1]
    dc = [-1, 1, 0, 0]
    q.append([a, b])
    while q:                   # q에 값이 있으면 반복
        x, y = q.popleft()
        for i in range(4):
            now_dr = x + dr[i]
            now_dc = y + dc[i]
            if 0 <= now_dr < N and 0 <= now_dc < M:   # 범위를 벗어나는지 체크
                if arr[now_dr][now_dc] == '#':        # 울타리는 못지나가므로
                    continue                          # continue
                if visited[now_dr][now_dc] != 0:      # 이미 방문한 곳이라면
                    continue                          # continue
                visited[now_dr][now_dc] = 1           # 방문 체크하고,
                if arr[now_dr][now_dc] == 'o':        # 양을 만나면
                    o_cnt += 1                        # 양의 수 + 1
                elif arr[now_dr][now_dc] == 'v':      # 늑대 만나면
                    v_cnt += 1                        # 늑대의 수 + 1
                q.append([now_dr, now_dc])            # 다음 위치 q에 저장


N, M = map(int, input().split())
arr = [list(map(str, list(input()))) for _ in range(N)]
q = deque()
visited = [[0]*M for _ in range(N)]       # 방문 체크 리스트
o_ans, v_ans = 0, 0

for row in range(N):
    for col in range(M):
        if visited[row][col] == 0:        # 아직 방문하지 않았다면
            v_cnt, o_cnt = 0, 0           # 양과 늑대의 수 초기화하고, 
            visited[row][col] = 1         # 방문 체크
            bfs(row, col)
            if v_cnt >= o_cnt:            # 늑대의 수가 양의 수보다 많으면
                v_ans += v_cnt            # 늑대의 수만 더하기
            else:                         # 양의 수가 늑대의 수보다 많으면
                o_ans += o_cnt            # 양의 수만 더하기

print(o_ans, v_ans)
문제 풀이

1) bfs를 통해 같은 구간에 있는 양과 늑대는 모두 체크.
2) bfs 탐색이 끝나면 양과 늑대의 수 비교하고, 늑대의 수가 양의 수보다 같거나 많으면 더하고, 양의 수가 늑대의 수보다 많으면 양의 수 더해줌.

'알고리즘 > 백준' 카테고리의 다른 글

[BOJ] 트리  (0) 2021.12.10
[BOJ] 프린터 큐  (0) 2021.12.09
[BOJ] 숨바꼭질  (0) 2021.12.07
[BOJ] 유기농 배추  (0) 2021.12.07
[BOJ] 블랙잭  (0) 2021.12.07