이번 문제는 삼성 기출 문제로 BFS를 이용한 구현으로 해결하였다. 우선 Combinations를 사용해야 한다는 생각을 하였고, itertools를 이용하여 Combinations를 사용하여 해결해본 후에, Combinations를 재귀함수로 직접 구하여 다시 해결해보았다. 안전지대의 최대값을 구하는 로직은 다음과 같이 구현하였다.
(r, c)
를 넣는다.visited[r][c]
를 True로 갱신한다.y+dy[i]
, x+dx[i]
로 선언한다.visited[ny][nx]
가 False이고, tmp[ny][nx]
가 1이 아닐 경우,visited[ny][nx]
를 True로 갱신한다.(ny, nx)
를 넣는다.(r, c)
를 넣는다.visited[r][c]
를 True로 갱신한다.y+dy[i]
, x+dx[i]
로 선언한다.visited[ny][nx]
가 False이고, tmp[ny][nx]
가 0일 경우,visited[ny][nx]
를 True로 갱신한다.(ny, nx)
를 넣는다.itertools.combinations를 이용한 풀이
from itertools import combinations
from copy import deepcopy
from collections import deque
n, m=map(int, input().split())
grid=[list(map(int, input().split())) for _ in range(n)]
dy, dx=[1, 0, -1, 0], [0, 1, 0, -1]
road=[]
for i in range(n):
for j in range(m):
if grid[i][j]==0:
road.append((i, j))
def bfs(r, c):
q=deque()
q.append((r, c))
visited[r][c]=True
while q:
y, x=q.popleft()
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<m and not visited[ny][nx] and tmp[ny][nx]!=1:
visited[ny][nx]=True
tmp[ny][nx]=2
q.append((ny, nx))
def get_safe(r, c):
q=deque()
q.append((r, c))
visited[r][c]=True
result=1
while q:
y, x=q.popleft()
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<m and not visited[ny][nx] and tmp[ny][nx]==0:
visited[ny][nx]=True
q.append((ny, nx))
result+=1
return result
comb=list(combinations(road, 3))
answers=[]
for i in range(len(comb)):
answer=0
tmp=deepcopy(grid)
visited=[[False for _ in range(m)] for _ in range(n)]
for j in range(len(comb[i])):
tmp[comb[i][j][0]][comb[i][j][1]]=1
for i in range(n):
for j in range(m):
if tmp[i][j]==2 and not visited[i][j]:
bfs(i, j)
for i in range(n):
for j in range(m):
if tmp[i][j]==0 and not visited[i][j]:
answer+=get_safe(i, j)
answers.append(answer)
print(max(answers))
재귀함수를 통해 combinations를 구현한 풀이
from copy import deepcopy
from collections import deque
n, m=map(int, input().split())
grid=[list(map(int, input().split())) for _ in range(n)]
dy, dx=[1, 0, -1, 0], [0, 1, 0, -1]
road=[]
for i in range(n):
for j in range(m):
if grid[i][j]==0:
road.append((i, j))
def get_comb(road, r):
comb=[]
if r==0:
return [[]]
for i in range(len(road)):
tmp=road[i]
road_tmp=road[i+1:]
for j in get_comb(road_tmp, r-1):
comb.append([tmp]+j)
return comb
def bfs(r, c):
q=deque()
q.append((r, c))
visited[r][c]=True
while q:
y, x=q.popleft()
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<m and not visited[ny][nx] and tmp[ny][nx]!=1:
visited[ny][nx]=True
tmp[ny][nx]=2
q.append((ny, nx))
def get_safe(r, c):
q=deque()
q.append((r, c))
visited[r][c]=True
result=1
while q:
y, x=q.popleft()
for i in range(4):
ny, nx=y+dy[i], x+dx[i]
if 0<=ny<n and 0<=nx<m and not visited[ny][nx] and tmp[ny][nx]==0:
visited[ny][nx]=True
q.append((ny, nx))
result+=1
return result
comb=get_comb(road, 3)
answers=[]
for i in range(len(comb)):
answer=0
tmp=deepcopy(grid)
visited=[[False for _ in range(m)] for _ in range(n)]
for j in range(len(comb[i])):
tmp[comb[i][j][0]][comb[i][j][1]]=1
for i in range(n):
for j in range(m):
if tmp[i][j]==2 and not visited[i][j]:
bfs(i, j)
for i in range(n):
for j in range(m):
if tmp[i][j]==0 and not visited[i][j]:
answer+=get_safe(i, j)
answers.append(answer)
print(max(answers))