본문 바로가기

알고리즘/백준

[백준] 15683번 : 감시

728x90

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

 

15683번: 감시

스타트링크의 사무실은 1×1크기의 정사각형으로 나누어져 있는 N×M 크기의 직사각형으로 나타낼 수 있다. 사무실에는 총 K개의 CCTV가 설치되어져 있는데, CCTV는 5가지 종류가 있다. 각 CCTV가 감

www.acmicpc.net

해당 문제는 완전탐색 + 깊이우선탐색 + 조합 문제로 해결 하였습니다.

1. CCTV를 하나씩 모두 다 돌려보며 사각지대의 최소값을 구합니다.

2. 해당 CCTV로부터 감시영역은 깊이우선탐색으로 탐색합니다.( 방향성이 있기 때문 )

3. 재귀 함수를 통하여 CCTV를 하나씩 돌려보며 모든 조합을 호출 합니다.

 

import copy
cctv = ['1','2','3','4','5']
N, M = map(int, input().split()) # N은 세로크기, M은 가로크기
graph = []
cctvlist = []
for i in range(N):
    table = list(map(str, input().split()))
    for j in range(M):
        if table[j] in cctv:
            cctvlist.append((i,j))
    graph.append(table)

def getBilndArea(table): # 현재 테이블에서 사각지대를 구한다.
    counter = 0
    for i in range(N):
        for j in range(M):
            if table[i][j]  == '0':
                counter += 1
    return counter

def dfs(i,j, move, table):
    ny = i + move[0]
    nx = j + move[1]
    if N > ny >=0 and M > nx >=0 and table[ny][nx] != '6':
        table[ny][nx] = '#'
        dfs(ny,nx, move, table)

move = [[],
        [[(0,1)],[(0,-1)], [(1,0)], [(-1,0)]],  #1번
        [[(1,0), (-1,0)], [(0,1), (0,-1)]], # 2번
        [[(-1,0), (0,1)], [(0,1), (1,0)], [(1,0), (0,-1)], [(-1,0), (0,-1)]], # 3번
        [[(0,-1), (0,1), (-1,0)], [(1,0), (0,1), (-1,0)], [(1,0), (0,1), (0,-1)], [(1,0), (-1,0), (0,-1)]],  # 4번
        [[(0,1), (1,0), (-1,0), (0,-1)]]] # 5번

minvalue = int(10e9)
def cctv(table, depth):
    global minvalue
    if depth == len(cctvlist): # 모두 방문 했으므로 사각지대를 샌다.
        minvalue = min(minvalue, (getBilndArea(table)))
        return

    i,j = cctvlist[depth];
    for moves in move[int(graph[i][j])]: # 각 cctv를 돌려본다.
        temp = copy.deepcopy(table)
        for m in moves:
            dfs(i,j,m, temp)
            
        cctv(temp, depth + 1)

cctv(graph, 0)
print(minvalue)
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 9466번 : 텀 프로젝트  (0) 2023.08.21
[백준] 9019번 : DSLR  (0) 2023.08.18
[백준] 1038번 : 감소하는 수  (0) 2023.08.17
[백준] 17142번 : 연구소 3  (0) 2023.08.16
[백준] 2589번 : 보물섬  (0) 2023.08.10