파이썬으로 부시자! Python with Coreenee

BAEKJOON 14502

문제

스크린샷 2020-05-03 오후 10 06 52 스크린샷 2020-05-03 오후 10 06 59

입력

스크린샷 2020-05-03 오후 10 07 05


나의 처음 코드

내가 문제를 푼 방식은 바로 백트래킹 + 브루트 포스로 해결하였다. 바이러스가 퍼지고 퍼지지 않은 공간의 최댓값을 구하면 된다. 그래서 빈칸의 좌표를 따로 저장한 후에, 벽을 세울 수 있는 모든 경우의 수를 for문으로 돌려준다. 벽이 3개가 추가된 맵을 바탕으로 bfs형식으로 풀면된다. 여기서 벽을 3개 추가하고 추가를 해제하는 방법에 대햇서 백트래킹 방법을 썼다. 코드는 다음과 같다.

N, M = list(map(int, input().split()))
wall_coord = []
virus_coord = []
map_list = []
#벽 좌표, 바이러스 좌표, 맵 입력 받기
for i in range(N):
    tmp_list = list(map(int, input().split()))
    for j in range(M):
        if tmp_list[j] == 0:
            wall_coord.append((i,j))
        if tmp_list[j] == 2:
            virus_coord.append((i,j))
    map_list.append(tmp_list)
        
max_space = -1
#오른 아래 왼 위
ud_list = [0, 1, 0, -1]
rl_list = [1, 0, -1, 0]

#브루트 포스 찾기
def solution(virus_list):
    cnt = 0
    visited_list = [[0] * M for _ in range(N)]
    while True:
        tmp_list = []
        for virus in virus_list:
            for i in range(4):
                new_x = virus[0] + ud_list[i]
                new_y = virus[1] + rl_list[i]
                if 0 <= new_x < N and 0 <= new_y < M and visited_list[new_x][new_y] == 0 and map_list[new_x][new_y] == 0:
                    cnt += 1
                    tmp_list.append((new_x, new_y))
                    visited_list[new_x][new_y] = 1
        virus_list = tmp_list
        if len(virus_list) == 0:
            #벽 3개를 세우고 solution들어왔으므로 -3 해줘야 한다
            return len(wall_coord) - 3 - cnt
     
     
#백트래킹 + 브루트포스 문제.                      
for i in range(len(wall_coord)-2):
    map_list[wall_coord[i][0]][wall_coord[i][1]] = 1
    for j in range(i+1,len(wall_coord)-1):
        map_list[wall_coord[j][0]][wall_coord[j][1]] = 1
        for k in range(j+1, len(wall_coord)):
            map_list[wall_coord[k][0]][wall_coord[k][1]] = 1
            #벽 세기
            ret_cnt = solution(virus_coord)
            max_space = ret_cnt if max_space < ret_cnt else max_space
            
            map_list[wall_coord[k][0]][wall_coord[k][1]] = 0
        map_list[wall_coord[j][0]][wall_coord[j][1]] = 0
    map_list[wall_coord[i][0]][wall_coord[i][1]] = 0
            

print(max_space)

코드를 짧게 만들고 싶었지만, 시간을 줄이기위해서 ,,,, ㅎㅎ