출처 : 이코테
벽(1)을 3개 설치해서 번지는 바이러스(2)를 막아 0의 최대 갯수를 구하라
#input
7 7
2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
📍 필요한 것
1. 상하좌우 방향 리스트
2. 바이러스 퍼지게 하는 def virus()
3. 0의 갯수 세는 def get_score()
4. 벽 설치 + 0 갯수 세는 def dfs()
n, m = map(int, input().split())
data = []
temp = [[0] * m for _ in range(n)]
print(temp)
for _ in range(n):
data.append(list(map(int,input().split())))
print(data)
#[[2, 0, 0, 0, 1, 1, 0],
# [0, 0, 1, 0, 1, 2, 0],
# [0, 1, 1, 0, 1, 0, 0],
# [0, 1, 0, 0, 0, 0, 0],
# [0, 0, 0, 0, 0, 1, 1],
# [0, 1, 0, 0, 0, 0, 0],
# [0, 1, 0, 0, 0, 0, 0]]
dx = [-1,0,1,0]
dy = [0,1,0,-1]
result = 0
def virus(x,y): # 바이러스가 퍼지게함
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx >= 0 and nx < n and ny >= 0 and ny < m:
if temp[nx][ny] == 0: # 범위 안이고 0이라면
temp[nx][ny] = 2 # #원본 데이터 대신 temp 사용
virus(nx,ny) # 재귀
def get_score(): # 안전 영역(0개수)
score = 0
for i in range(n):
for j in range(m):
if temp[i][j] == 0: # 변해야 하는 temp 사용
score += 1
return score
def dfs(count): # 벽 설치
global result
if count == 3: # 벽 3개
for i in range(n):
for j in range(m):
temp[i][j] = data[i][j] # 원본을 temp로 다 저장
for i in range(n):
for j in range(m):
if temp[i][j] == 2: # 바이러스라면
virus(i,j) # 퍼지게해라
# 0의 갯수의 최대값
print("temp",temp)
result = max(result, get_score())
return
# --------------------분기
for i in range(n): # 벽 설치가 3개 미만이면
for j in range(m):
if data[i][j] == 0: # 0이라면 벽 설치해라
data[i][j] = 1
count += 1 # 벽 갯수 + 1
dfs(count)
data[i][j] = 0 # 원본 되돌리기
count -= 1
# for문으로 [0][0], [0][1], [1][0] 반복
dfs(0)
print(result)
tmp의 역할
temp는 초기 맵의 상태를 보존하기 위한 역할을 합니다. 주어진 코드에서temp는 미로의 현재 상태를 저장하고, 벽을 설치하고 바이러스를 퍼뜨린 후에도 이전 상태를 유지하는 데 사용됩니다.
미로 상태를temp에 복사하는 이유는 다음과 같습니다:
1.dfs함수에서 벽을 설치하고 시뮬레이션을 진행할 때, 원본data맵을 변경하게 되면, 한 번의 시뮬레이션이 끝난 후에 이전 상태로 돌리기가 어려워집니다.
2. 따라서temp라는 복사본을 만들어 현재 상태를 저장하고, 이를 활용하여 벽을 설치하고 바이러스를 퍼뜨린 다음에도temp를 원상태로 복원하여 다음 시뮬레이션에 활용합니다.
3. 이러한 방식으로dfs함수가 벽을 설치하는 과정을 시뮬레이션할 때,data맵을 변경하지 않고temp를 사용하여 상태를 조작하므로, 시뮬레이션 간의 상태 공유 및 초기화가 편리하게 이루어집니다.
요약하면,temp는 맵의 현재 상태를 보존하고 시뮬레이션을 수행하는 동안에만 변경되는 맵으로 사용됩니다. 이를 통해 원본 데이터(data)를 손상시키지 않으면서 다양한 시뮬레이션을 수행할 수 있게 됩니다.