[BOJ] Q15683 감시

Question

Language: Python

Difficulty: Gold 4

CCTV 개수가 최대 8개 이고, 방의 크기 또한 최대 8X8 이므로 해당 문제는 bruteforce 방식으로 풀이 할 수 있다.

모든 CCTV에 대해선 각각의 다른 방향에 대한 조합을 통해 모든 경우의 수를 비교해서 최소 사각지대를 보이는 조합을 구한다.

각각의 CCTV의 방향 정보는 아래의 dictionary를 이용한다.

cctv_types={
        1: [[0],[1],[2],[3]],
        2: [[0,2],[1,3]],
        3: [[0,1],[1,2],[2,3],[3,0]],
        4: [[0,1,2],[1,2,3],[2,3,0],[3,0,1]],
        5: [[0,1,2,3]]
}

Solution

from math import inf
from copy import deepcopy
def check_empty_space(cctvs):
    temp_graph=deepcopy(graph)

    for cctv_row,cctv_col, cctv_directions in cctvs:
        for cctv_direction in cctv_directions:
            for times in range(max(height,width)):
                next_row=cctv_row +dy[cctv_direction]*times
                next_col=cctv_col +dx[cctv_direction]*times

                if next_row < 0 or next_row >= height or next_col < 0 or next_col >=width:
                    break
                if graph[next_row][next_col]==6:
                    break
                
                temp_graph[next_row][next_col]=7

    count=0
    for row in range(height):
        for col in range(width):
            if temp_graph[row][col] == 0:
                count+=1

    return count

    
def dfs(index, cctvs):
    global result
    if index == len(blanks):
        result=min(result,check_empty_space(cctvs))
        return

    row=blanks[index][0]
    col=blanks[index][1]
    cctv_type=blanks[index][2]

    for direction in cctv_types[cctv_type]:
        dfs(index+1,cctvs+[(row,col,direction)])

def solution():
    for row in range(height):
        for col in range(width):
            if graph[row][col] !=6 and graph[row][col] !=0:
                blanks.append((row,col,graph[row][col]))
    dfs(0,[])
    print(result)
    


if __name__ == "__main__":
    dy=[-1,0,1,0]
    dx=[0,1,0,-1]

    cctv_types={
        1: [[0],[1],[2],[3]],
        2: [[0,2],[1,3]],
        3: [[0,1],[1,2],[2,3],[3,0]],
        4: [[0,1,2],[1,2,3],[2,3,0],[3,0,1]],
        5: [[0,1,2,3]]
    }
    
    result=inf
    blanks=[]
    height,width=map(int,input().split())
    graph=[list(map(int,input().split())) for _ in range(height)]

    solution()

댓글남기기