이번 문제는 깊이우선탐색을 통해 해결하였다. 일반적인 깊이우선탐색 문제와 비슷하게 풀이하였지만 조금은 달랐다. 그때 그때 좌표의 값에 따라서 영역 안의 늑대와 양의 수를 카운팅하고 깊이우선탐색이 한번 끝날 때마다 늑대와 양의 수를 비교하여 더 큰 수를 해당 카운팅 변수에 더해주는 방식으로 접근하였다.
visited[y][x]
를 True로 갱신한다.y+dy[i]
로 선언한다.x+dx[i]
로 선언한다.visited[ny][nx]
가 False이고 field[ny][nx]
가 '#'이 아닐 경우,field[ny][nx]
가 'v'일 경우, v를 1 증가시킨다.field[ny][nx]
가 'o'일 경우, o를 1 증가시킨다.dfs(ny, nx)
를 재귀호출한다.field[i][j]
가 '#'가 아니고, visited[i][j]
가 False일 경우,field[i][j]
가 'v'일 경우, v를 1 증가시킨다.field[i][j]
가 'o'일 경우, o를 1 증가시킨다.dfs(i, j)
를 호출한다.import sys
sys.setrecursionlimit(10**9)
def dfs(y, x):
global v
global o
visited[y][x]=True
dy=[0, 0, 1, -1]
dx=[1, -1, 0, 0]
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny>=0 and nx>=0 and ny<r and nx<c:
if visited[ny][nx]==False and field[ny][nx]!='#':
if field[ny][nx]=='v':
v+=1
if field[ny][nx]=='o':
o+=1
dfs(ny, nx)
r,c=map(int, input().split())
field=[]
for _ in range(r):
field.append(list(str(input())))
visited=[[False]*c for _ in range(r)]
v_cnt=0
o_cnt=0
v=0
o=0
for i in range(r):
for j in range(c):
if field[i][j]!='#' and visited[i][j]==False:
if field[i][j]=='v':
v+=1
if field[i][j]=='o':
o+=1
dfs(i, j)
if v<o:
o_cnt+=o
else:
v_cnt+=v
o, v=0,0
print(o_cnt, v_cnt)