본문 바로가기
Algorithm problem solving/풀이

14502. 연구소

by Jiyoon-park 2020. 4. 13.

(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