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



Solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
벽을 세울 수 모든 경우의 수를 탐색하고 그 중 안전 영역이 가장 큰 경우를 출력.

'Algorithm > BOJ' 카테고리의 다른 글
[백준/Python] 1260번 DFS와 BFS (0) | 2020.04.19 |
---|---|
[백준/Python] 1012번 유기농배추 (0) | 2020.04.18 |
[백준/Python] 14891번 톱니바퀴 (0) | 2020.04.11 |
[백준/Python] 17822번 원판 돌리기 (0) | 2020.04.09 |
[백준/Python] 2644번 촌수계산 (0) | 2020.04.09 |
,