삼성 SW 역량 테스트 기출 문제

https://www.acmicpc.net/problem/14502

 

14502번: 연구소

인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크기가 N×M인 직사각형으로 나타낼 수 있으며, 직사각형은 1×1 크기의 정사각형으로 나누어져 있다. 연구소는 빈 칸, 벽으로 이루어져 있으며, 벽은 칸 하나를 가득 차지한다.  일부 칸은 바이러스가 존재하며, 이 바이러스는 상하좌우로 인접한 빈 칸으로 모두 퍼져나갈 수 있다.

www.acmicpc.net



Solution

import copy
arr = []
virusList = []
dx = [-1,1,0,0]
dy = [0,0,-1,1]
maxVal = 0
def spreadVirus(x, y, copy_arr):
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if copy_arr[nx][ny] == 0:
copy_arr[nx][ny] = 2
spreadVirus(nx, ny, copy_arr)
def setWall(start, wallCount):
global maxVal
if wallCount == 3:
copy_arr = copy.deepcopy(arr)
for i in range(len(virusList)):
(virusX, virusY) = virusList[i]
spreadVirus(virusX, virusY, copy_arr)
maxVal = max(maxVal, getSafeArea(copy_arr))
return
for i in range(start, n*m):
x = i // m
y = i % m
if arr[x][y] == 0:
arr[x][y] = 1
setWall(i+1, wallCount+1)
arr[x][y] = 0
def getSafeArea(copy_arr):
area = 0
for i in range(n):
for j in range(m):
if copy_arr[i][j] == 0:
area += 1
return area
if __name__ == "__main__":
n, m = map(int, input().split(' '))
for _ in range(n):
arr.append(list(map(int, input().split(' '))))
for i in range(n):
for j in range(m):
if arr[i][j] == 2:
virusList.append((i,j))
setWall(0, 0)
print(maxVal)
view raw 연구소.py hosted with ❤ by GitHub

 

벽을 세울 수 모든 경우의 수를 탐색하고 그 중 안전 영역이 가장 큰 경우를 출력.

 

 

 

 

 

 

 


생강강

,