개발/algorithm
[백준 3184번] 양 -python
zzi_on2
2022. 1. 26. 17:00
문제 링크
https://www.acmicpc.net/problem/3184
3184번: 양
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
www.acmicpc.net
풀이
- bfs 풀이
1. maps에서 양이거나 늑대이면, bfs 실행
2. bfs를 통해서 울타리로 둘러쌓인 부분에 속하는 양과 늑대의 수 구하기
3. 만약 늑대의 수가 양의 수보다 크거나 같으면 살아남은 늑대 수 증가, 양의 수가 더 많으면 살아남은 양의 수 증가
from collections import deque
nx = [ 1, -1, 0, 0 ]
ny = [ 0, 0, 1, -1 ]
def bfs(i,j):
# 울타리로 둘러쌓인 공간에 있는 늑대와 양의 수 계산
v_num = 0
c_num = 0
q = deque()
q.append((i,j))
maps[i][j] = "."
while q :
x, y = q.popleft()
for i in range(4):
dx = x + nx[i]
dy = y + ny[i]
# 울타리가 아니면
if 0 <= dx < r and 0 <= dy < c and maps[dx][dy] != "#":
# 큐에 추가
q.append((dx,dy))
# 늑대 수 증가 & 탐색한 부분 울타리로 바꿔주기
if maps[dx][dy] == "v":
v_num += 1
maps[dx][dy] = "#"
# 양의 수 증가
elif maps[dx][dy] == "o":
c_num +=1
maps[dx][dy] = "#"
else:
maps[dx][dy] = "#"
return v_num, c_num
r, c = map(int,input().split())
maps=[]
for _ in range(r):
maps.append(list(map(str,input())))
# 살아남은 늑대와 양의 수 저장
v_result = 0
o_result = 0
for i in range(r):
for j in range(c):
if maps[i][j] == 'v' :
v_num, o_num = bfs(i,j)
# 시작 위치의 늑대 수 포함
v_num += 1
# 늑대의 수가 양의 수보다 크거나 같으면 살아남은 늑대 수 증가
if v_num >= o_num:
v_result += v_num
# 양의 수가 더 많으면 살아남은 양의 수 증가
else:
o_result += o_num
elif maps[i][j]== 'o':
v_num, o_num = bfs(i,j)
# 시작 위치의 양의 수 포함
o_num += 1
if v_num >= o_num:
v_result += v_num
else:
o_result += o_num
print(o_result, v_result)