본문 바로가기
코딩 테스트/DFS, BFS

연구소

by hazel_ 2021. 1. 26.

p.341

 

DFS

import sys
from itertools import combinations

input=sys.stdin.readline
n,m=map(int, input().split())
graph=[]
temp=[[0]*m for _ in range(n)] 
fence=[]
virus=[]
result=0

for i in range(n):
  graph.append(list(map(int, input().split())))

for i in range(n):
  for j in range(m):
    if graph[i][j]==0: # 울타리 칠 수 있는 위치
      fence.append((i,j))
    elif graph[i][j]==2: #바이러스 위치
      virus.append((i,j))

fence_c=list(combinations(fence,3)) # 울타리를 놓을 수 있는 경우의 수

da=[-1,1,0,0]
db=[0,0,-1,1]

####### dfs 함수 ########
def dfs(v_a,v_b):
  temp[v_a][v_b]=2

  for i in range(4):
    n_a=v_a+da[i]
    n_b=v_b+db[i]
    if n_a<0 or n_b<0 or n_a>=n or n_b>=m:
      continue
    elif temp[n_a][n_b]==1:
      continue
    elif temp[n_a][n_b]==0:
      dfs(n_a,n_b)
#########################


for f in fence_c:

  for i in range(n): # 울타리 위치를 바꿀 때마다 초기화
    for j in range(m):
      temp[i][j]=graph[i][j]

  for f_a,f_b in f: # 울타리 3개씩 놓아보기
    temp[f_a][f_b]=1
  
  # 바이러스인 곳 부터 dfs로 바이러스 퍼트리기
  for v in virus:
    v_a, v_b=v
    dfs(v_a,v_b)

  count=0
  # 바이러스 퍼트리고 남은 0 갯수 비교
  for i in range(n):
    for j in range(m):
      if temp[i][j]==0:
        count+=1
  
  result=max(result, count)

print(result)

 

시간이 오래걸려서 조마조마 했는데.. 맞았다 ㅠㅠㅠ

'코딩 테스트 > DFS, BFS' 카테고리의 다른 글

괄호 변환  (0) 2021.01.29
경쟁적 전염  (0) 2021.01.27
특정 거리의 도시 찾기  (0) 2021.01.26
미로 탈출  (0) 2021.01.25
음료수 얼려 먹기  (0) 2021.01.25

댓글