(0413) PASS
from collections import deque
import copy
def bfs(arr):
global virusInfo, maxV
q = deque()
for v in virusInfo:
q.append(v)
while q:
dx = [0,1,0,-1]
dy = [1,0,-1,0]
si, sj = q.popleft()
for k in range(4):
ni = si + dx[k]
nj = sj + dy[k]
if 0 <= ni < n and 0 <= nj < m and arr[ni][nj] == 0:
arr[ni][nj] = 2
q.append((ni,nj))
count = 0
for o in range(n):
for p in range(m):
if arr[o][p] == 0:
count += 1
if maxV < count:
maxV = count
def makewall(cnt):
global visited
# 벽 세개 다세우면, 배열 복사
if cnt == 3:
target = copy.deepcopy(maze)
# 바이러스 전파
bfs(target)
return
else:
for i in range(n):
for j in range(m):
if maze[i][j] == 0 and visited[i][j] == 0:
visited[i][j] = 1
maze[i][j] = 1
makewall(cnt+1)
visited[i][j] = 0
maze[i][j] = 0
n, m = map(int, input().split())
maze = [list(map(int, input().split())) for _ in range(n)]
visited = [[0]*m for _ in range(n)]
virusInfo = []
maxV = 0
# 바이러스 정보 저장
for i in range(n):
for j in range(m):
if maze[i][j] == 2:
virusInfo.append((i,j))
# 벽 세우기
makewall(0)
print(maxV)
+ )
아무리 풀어봐도 안풀리길래 정말 오래 고민했는데 말도 안되는 실수를 했다.
변수 이름에 map도 있고 n을 두개나 서로 다른 변수에 중복 대입했다.
변수 이름 주의해서 짓자는 뜻에서 남기는 대환장파티의 현장. 다시는 그러지 말자 !
from collections import deque
def bfs(lst):
global virus, maxV
q = deque()
for v in virus:
q.append(v)
#오아왼위
dx = [0, 1, 0, -1]
dy = [1, 0 ,-1, 0]
while q:
si, sj = q.popleft()
for k in range(4):
ni = si + dx[k]
nj = sj + dy[k]
if 0 <= ni < n and 0 <= nj < m and lst[ni][nj] == '0':
lst[ni][nj] = '2'
q.append((ni,nj))
count = 0
for i in range(n):
for j in range(m):
if lst[ni][nj] == '0':
count += 1
if maxV < count :
maxV = count
return maxV
def dfs(n):
global map
if n == 3:
map2 = [[0]*m for _ in range(n)]
for i in range(n):
for j in range(m):
map2[i][j] = map[i][j]
bfs(map2)
return
else:
for i in range(n):
for j in range(m):
if map[i][j] == '0' and visited[i][j] == 0:
visited[i][j] = 1
map[i][j] = '1'
dfs(n+1)
map[i][j] = '0'
visited[i][j] = 0
n, m = map(int, input().split())
map = [list(input().split()) for _ in range(n)]
visited = [[0]*m for _ in range(n)]
virus = []
maxV = 0
for i in range(n):
for j in range(m):
if map[i][j] == '2':
virus.append((i,j))
dfs(0)
print(maxV)
'Algorithm problem solving > 풀이' 카테고리의 다른 글
2231. 분해합 (0) | 2022.02.06 |
---|---|
[단계별로 풀어보기] 1차원 배열_All Pass (0) | 2020.04.02 |
4836. 색칠하기 (0) | 2020.03.11 |
1959. 두개의 숫자열 (0) | 2020.03.09 |
4835. 구간합 (0) | 2020.03.09 |